0


【通信原理实验】基于A律13折线的PCM编码与解码(附完整代码)

一、实验原理

PCM,Pulse Code Modulation(脉冲编码调制),即把从模拟信号抽样、量化、编码成为二迚制符号的基本过程, 称为脉冲编码调制。

模拟信号的数字化过程:

1、抽样 – 时间离散:时间连续的信号 -> 时间离散、幅度连续的信号;

• 抽样定理(香农采样定律、奈奎斯特采样定律):设时间连续信号f(t),其最高截止频率为fm, 如果用时间间隔为𝑇 ≤ 1 2𝑓𝑚 的开关信号对f(t)迚行抽样时,则f(t)就可被样值信号唯一地表示。

• 这样可以只传输这些离散的抽样值,接收端就能恢复原模拟信号。

• 例:典型电话信号的最高频率通常限制在3400Hz,而抽样频率通常采用8000Hz。

模拟信号抽样及频谱:

2、量化与编码

•量化:一个连续幅度值的无限数集合 -> 一个 离散幅度值的有限数集合。

• 编码:将量化后的信号编码形成一个二迚制 码组输出。国际标准化的PCM码组是用八位 码组代表一个抽样值。

• 均匀量化:量化间隔保持不变。

• 非均匀量化:根据信号的不同区间来确定量 化间隔 • 非均匀量化优势:当输入信号具有非均匀分 布;改善了小信号时的信噪比。

二、A律13折线法

• 1位:极性正负

• 2-4位:段落码,非均匀量化

• 5-8位:段内码,均匀量化


三、pcm编码与解码

题目:对于给定的语音文件进行a律13折线编码,观察原音频信号波形、抽样后音频信号波形、编码后的数据、解码后的数据。

(1)读取语音文件进行抽样量化

  1. %%读取本地wav文件
  2. filePath='Windows XP 关机.wav';
  3. [y,Fs]=audioread(filePath);
  4. y=y'; %转置
  5. yCh1=y(1,:); %取一个声道
  6. figure
  7. dt=1/Fs;
  8. t=0:dt:(length(yCh1)-1)*dt;
  9. plot(t,yCh1);
  10. title('wav音频信号波形');

(2)a律13折线编码

  1. sampleVal=8000;%8k抽样率
  2. [sampleData,a13_moddata]=PCM_13Encode(yCh1,Fs,sampleVal);
  3. save('encode_data01.mat','a13_moddata');
  4. figure
  5. dt1=1/sampleVal;
  6. t1=0:dt1:(length(sampleData)-1)*dt1;
  7. plot(t1,sampleData);
  8. title('wav音频信号抽样后的波形');
  9. figure
  10. plot(a13_moddata);
  11. title('编码后的bit数据');

(3)13折线具体编码

在这里我们采用以下引用方式;

  1. function [sampleData,a13_moddata] = PCM_13Encode(inputData,Fs,sampleVal)
  2. [ a13_moddata ] = a_13coding( sampleData );

a13_moddata 函数:

  1. function [ a13_moddata ] = a_13coding( x )
  2. n=length(x);
  3. a13_moddata=zeros(1,n*8);
  4. for bb=1:n
  5. Is=x(1,bb);
  6. if Is>1||Is<-1,error('input must within [-1,1]'),end
  7. Is=round(Is*2048);
  8. C=zeros(1,8); %将8PCM编码初始化为全0
  9. if Is>0
  10. C(1)=1 ; %判断抽样值的正负
  11. end
  12. % the polarity determins C(1)
  13. abIs=abs(Is);
  14. if 0<abIs && abIs<=16
  15. C(2:4)=[0 0 0]; %8级量化编码
  16. q=1;
  17. a=0;
  18. C(5:8)=e_coding(abIs,q,a); %16级量化编码
  19. end
  20. if 16<abIs && abIs<=32
  21. C(2:4)=[0 0 1];
  22. q=1;
  23. a=16;
  24. C(5:8)=e_coding(abIs,q,a);
  25. end
  26. if 32<abIs && abIs<=64
  27. C(2:4)=[0 1 0];
  28. q=2;
  29. a=32;
  30. C(5:8)=e_coding(abIs,q,a);
  31. end
  32. if 64<abIs && abIs<=128
  33. C(2:4)=[0 1 1];
  34. q=4;
  35. a=64;
  36. C(5:8)=e_coding(abIs,q,a);
  37. end
  38. if 128<abIs && abIs<=256
  39. C(2:4)=[1 0 0];
  40. q=8;
  41. a=128;
  42. C(5:8)=e_coding(abIs,q,a);
  43. end
  44. if 256<abIs && abIs<=512
  45. C(2:4)=[1 0 1];
  46. q=16;
  47. a=256;
  48. C(5:8)=e_coding(abIs,q,a);
  49. end
  50. if 512<abIs && abIs<=1024
  51. C(2:4)=[1 1 0];
  52. q=32;
  53. a=512;
  54. C(5:8)=e_coding(abIs,q,a);
  55. end
  56. if 1024<abIs && abIs<=2048
  57. C(2:4)=[1 1 1];
  58. q=64;
  59. a=1024;
  60. C(5:8)=e_coding(abIs,q,a);
  61. end
  62. a13_moddata(1,(bb-1)*8+1:bb*8)=C; %得到8pcm编码
  63. end
  64. end
  65. %16级量化编码函数
  66. function [ four ]=e_coding(Is,q,a)
  67. four=zeros(1,4);
  68. for k=1:16
  69. if Is>a+(k-1)*q && Is<=a+k*q
  70. four=dec2bin(k-1,4);
  71. four=str2num(four(:))';
  72. else
  73. end
  74. end
  75. end

(4)pcm解码

  1. clc
  2. clear
  3. sampleVal=8000;
  4. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  5. %%读取编码数据 mat文件
  6. data =load('a02.mat') ; %读取mat 文件
  7. a13_moddata=data.a13_moddata; %获取mat文件a13_moddata的数据
  8. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  9. %%PCM 13折线解码
  10. [outData] = PCM_13Decode( a13_moddata );
  11. figure
  12. dt1=1/sampleVal;
  13. t1=0:dt1:(length(outData)-1)*dt1;
  14. plot(t1,outData);
  15. title('解码还原后的语音波形');
  16. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  17. %%将语音数据写入音频WAV文件
  18. writeData=[outData;outData]';%复制声道1数据到声道2,并转置
  19. writeFilePath='decode_data02.wav';
  20. audiowrite(writeFilePath,writeData,sampleVal);

(5)解码函数

解码引用PCM_13Decode函数,其中具体代码为:

  1. function [outData] = PCM_13Decode( inputData )
  2. n=length(inputData);
  3. outData=zeros(1,n/8);
  4. MM=zeros(1,8);
  5. for kk=1:n/8
  6. MM(1:8)=inputData(1,(kk-1)*8+1:kk*8); %取得8PCM
  7. temp=MM(2)*2^2+MM(3)*2+MM(4) ; %将8PCM码的第2~4位二进制数转化为10进制(三位二进制转十进制)
  8. %用于判断抽样值在哪个段落内
  9. % 段落序号i=1
  10. if temp==0
  11. q=1; %段内量化间隔
  12. a=0; %段落起始电平
  13. end
  14. % 段落序号i=2
  15. if temp==1
  16. q=1;
  17. a=16;
  18. end
  19. % 段落序号i=3
  20. if temp==2
  21. q=2;
  22. a=32;
  23. end
  24. % 段落序号i=4
  25. if temp==3
  26. q=4;
  27. a=64;
  28. end
  29. % 段落序号i=5
  30. if temp==4
  31. q=8;
  32. a=128;
  33. end
  34. % 段落序号i=6
  35. if temp==5
  36. q=16;
  37. a=256;
  38. end
  39. % 段落序号i=7
  40. if temp==6
  41. q=32;
  42. a=512;
  43. end
  44. % 段落序号i=8
  45. if temp==7
  46. q=64;
  47. a=1024;
  48. end
  49. A= MM(5)*2^3+MM(6)*2^2+MM(7)*2+MM(8) ;%8PCM码的第5~8位二进制数转化为10进制
  50. %用于判断抽样值量化级数
  51. R=(a+A*q+q/2)/2048;%取量化间隔中点值进行译码
  52. if MM(1)==0 %判断极性
  53. R=-R;
  54. end
  55. outData(1,kk)=R;%译码后数据
  56. end
  57. end

以上就是pcm基于A律13折线的编码与解码的全部模块了,放到一起就可以运行了,记得把文件名改成自己的,然后放到同一目录中。


本文转载自: https://blog.csdn.net/weixin_52336311/article/details/130350702
版权归原作者 pumpkin 春夏 所有, 如有侵权,请联系我们删除。

“【通信原理实验】基于A律13折线的PCM编码与解码(附完整代码)”的评论:

还没有评论