Advertisement
Guest User

kamyk

a guest
Jan 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.57 KB | None | 0 0
  1. close all;
  2. clear all;
  3. %初始化,n为量化级数
  4. mu=input('Please enter the value MU:');
  5. if isempty(mu)
  6.     mu=255;
  7. end;
  8. n=input('Please enter the qualify level n:');
  9. if isempty(n)
  10.     n=8;
  11. end;
  12. dt=0.01;                                %时域分辨率的初始化(单位:ms)
  13. N=500;                                  %采样点个数
  14. T=dt*N;                                 %时域宽度
  15. t=linspace(-T/2,T/2,N);                 %时间轴值
  16. fx=0.04;                                %模拟信号的频率(单位:kHz)
  17. a=sin(2*pi*fx*t);                       %绘制曲线(约能画出0.5个周期)
  18. %a=randn(1,500);
  19. %a=[20*randn(1,20),rand(1,480)];
  20. a_ori=a;                                %保留原始的信号
  21. lt=5;                                   %每次抽样需要处理的采样点个数
  22. te=linspace(-T/2,T/2,N/lt);
  23. for i=1:lt:length(t)
  24.     if (i+lt)>length(t)
  25.         a([i:length(a)])=a(i+1);        %防止超标
  26.     else  
  27.         a(i+[0:lt])=a(i+1);
  28.     end
  29. end
  30. amax=max(abs(a));
  31. a_quan=a/amax;                          %归一化
  32. a_quan=mulaw(a_quan,mu);                %进行mu率算法
  33. b_quan=a_quan;
  34. d=2/n;                                  %量化间隔
  35. q=d.*[0:n-1];                          
  36. q=q-((n-1)/2)*d;                        %量化电平
  37. %进行量化
  38. for i=1:n
  39.     a_quan(find((q(i)-d/2<=a_quan) & (a_quan<=q(i)+d/2)))=...%定位第i个量化间隔码子
  40.     q(i).*ones(1,length(find((q(i)-d/2<=a_quan)&(a_quan<=q(i)+d/2))));
  41.     %赋值为相应的量化电平
  42.     b_quan(find(a_quan==q(i))) =(i-1).*ones(1,length(find(a_quan==q(i))));%转化为对应的整数
  43. end
  44. a_quan=invmulaw(a_quan,mu);
  45. a_quan=a_quan*amax;                     %恢复原值,去规一化(量化后)
  46. nu=ceil(log2(n));                       %编码位数
  47. code=zeros(length(a),nu);
  48. for i=1:length(a)
  49.     for j=nu:-1:0                       %从高向低编码
  50.         if (fix(b_quan(i)/(2^j))==1)
  51.         code(i,(nu-j))=1;
  52.         b_quan(i)=b_quan(i)-2^j;
  53.         end
  54.     end
  55. end
  56.  
  57. code_temp=zeros(10,nu);                 %存储前10个量化编码的中间变量
  58. quan_temp=zeros(10,1);                  %存储前10个量化值的中间变量
  59. count=1;                                %计数器
  60. for i=1:length(a)/lt                    %循环找到前10个输入信号量化值
  61.     count=count+1;
  62.     quan_temp(i,1)=a_quan(1,i*lt);
  63.     code_temp(i,:)=code(i*lt,:);
  64.     if count==11                        %控制循环次数
  65.         break;
  66.     end
  67. end
  68.  
  69. sqnr=20*log10(norm(a)/norm(a-a_quan))  %求量化信噪比
  70. error=zeros(1,N/lt);
  71. for i=1:N/lt
  72.     error(i)=a(i*lt)-a_quan(i*lt);
  73. end
  74. %显示前10个值
  75. quan_temp
  76. code_temp
  77. %画图:
  78. figure(1)
  79. set(1,'position',[10,50,350,250])%设置窗口位置
  80. plot(t,a_quan,'b',t,a_ori,'r')
  81. grid on
  82. axis([-T/2,T/2,min(a),max(a)])%设置坐标格式    
  83. xlabel('t(ms)')%给X轴加标签
  84. ylabel('s(t)') %给Y轴加标签
  85. title('量化级数为n时的u率量化曲线')
  86.  
  87. figure(2)
  88. set(2,'position',[350,50,350,250])%设置窗口位置
  89. plot((a_ori/max(a_ori)),(a_quan/max(a_ori)),'b')
  90. grid on
  91. axis([-1,1,-1,1])%设置坐标格式     
  92. xlabel('input')%给X轴加标签
  93. ylabel('output') %给Y轴加标签
  94. title('量化级数为n时的输入-输出曲线')
  95.  
  96. figure(3)
  97. set(3,'position',[700,50,350,250])%设置窗口位置
  98. stem(te,error,'b')
  99. grid on
  100. axis([-T/2,T/2,min(a),max(a)])%设置坐标格式    
  101. xlabel('t(ms)')%给X轴加标签
  102. ylabel('Δs') %给Y轴加标签
  103. title('量化级数为n时的非均匀量化误差图')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement