Matlab中实现均匀量化

这项任务的目的是设计一个Matlab程序来进行A/D和D/A转换,并对特定的信号进行采样、量化和去采样的过程。

1. 生成初始信号

利用自己的学号生成特定的输入信号.

%SID = 21059653;
A_1 = 2+1+0+5;
A_2 = 9+6+5+3;
% transfer last 4 digits to 16-bit binary
last4 = 9653;
last4_bin = dec2bin(last4,16);
f_1 = count(last4_bin,'1');
f_2 = count(last4_bin,'0');
% ------------------------------------step 1
t = 0:1/1001:1;
x = A_1*cos(2*pi*f_1*t)+A_2*sin(2*pi*f_2*t);
figure;
plot(t,x);
title('Input signal using own parameters');
ylabel('Magnitude');
xlabel('Time');

 

2. 采样过程

用两种不同的采样频率对原始信号进行采样.

% ------------------------------------step 2
f_n = 2*max(f_1,f_2);  
dt_1 = 1/(2*f_n);      % Sampling time interval for 2fn 
T_sam1 = 0:dt_1:1;
x_samp1 = A_1*cos(2*pi*f_1*T_sam1)+A_2*sin(2*pi*f_2*T_sam1);
stem(T_sam1,x_samp1);
title('Sampled Signal with 2fn Hz');
ylabel('Magnitude');
xlabel('Time');

dt_2 = 1/(f_n/2);      % Sampling time interval for fn/2
T_sam2 = 0:dt_2:1;
x_samp2 = A_1*cos(2*pi*f_1*T_sam2)+A_2*sin(2*pi*f_2*T_sam2);
stem(T_sam2,x_samp2);
title('Sampled Signal with fn/2 Hz');
ylabel('Magnitude');
xlabel('Time');
set(gca,'XAxisLocation','origin'); 

此处的2f_n为尼奎斯特速率,故当采样频率小于其时会发生失真情况.

 

3. 量化过程

在这个项目中我们使用4 bits量化,故整个区域将被划分为16个子区域。这16个子区域从下到上被分配为二进制格式的数字0-15,以便来进行去量化处理。

% ------------------------------------step 3
R = 4;                           % quantization bits
a = abs(A_2)+abs(A_1);
reg = [-a,a];                    % range of the input signal
delta = (2*a/2^R);               % length of each region
plot(0:10000001:1,-a:delta:a);
xlim([0 1]);
ylim([-a a]);
grid on;
set(gca,'XTick',(0:.1:1))        % Change x-axis coordinate interval with 0.1 
set(gca,'YTick',(-a:delta:a))    % Change y-axis coordinate interval with delta 
set(gca,'XAxisLocation','origin'); 
title('Codebook for quantization')
set(gca,'XAxisLocation','origin');
str = [0000,0001,0010,0011,0100,0101,0110,0111,1000,1001,1010,1011,1100,1101,1110,1111];
text(.92,-a+delta/2,'0000');     % Assign the binary number to sub-regions
text(.92,-a+delta/2+1*delta,'0001');
text(.92,-a+delta/2+2*delta,'0010');
text(.92,-a+delta/2+3*delta,'0011');
text(.92,-a+delta/2+4*delta,'0100');
text(.92,-a+delta/2+5*delta,'0101');
text(.92,-a+delta/2+6*delta,'0110');
text(.92,-a+delta/2+7*delta,'0111');
text(.92,-a+delta/2+8*delta,'1000');
text(.92,-a+delta/2+9*delta,'1001');
text(.92,-a+delta/2+10*delta,'1010');
text(.92,-a+delta/2+11*delta,'1011');
text(.92,-a+delta/2+12*delta,'1100');
text(.92,-a+delta/2+13*delta,'1101');
text(.92,-a+delta/2+14*delta,'1110');
text(.92,-a+delta/2+15*delta,'1111');

对于每个采样点,相应的值被量化为其相应区域的中间值。下图是对应的编码本:

 4. 量化

上一节显示了量化过程的编码本。将每个采样信号所对应的4位二进制数存储在变量'value'中,是一个n*4的阵列。为了进行恢复去量化信号的算法,根据收到的量化位和编码本,将每个信号的二进制数转为十进制。

% --------de-quantization
for j = 1:length(x_qt1)
    indec(j) = bin2dec(value(j,:));         % transfer binary to decimal for frequency 2fn
    x_deqt1(j) = (-a+delta/2)+indec(j)*delta;
end
stem(T_sam1,x_deqt1,'v');
hold on;
stem(T_sam1,x_samp1);
xlim([0 1]);
ylim([-a a]);
grid on;
hold off;
set(gca,'YTick',(-a:delta:a));       
set(gca,'XAxisLocation','origin'); 
title('De-quantization Signal with 2fn Hz');
ylabel('Magnitude');
xlabel('Time');

for j = 1:length(x_qt2)
    indec1(j) = bin2dec(value1(j,:));         % transfer binary to decimal for frequency fn/2
    x_deqt2(j) = (-a+delta/2)+indec1(j)*delta;
end
stem(T_sam2,x_deqt2,'v');
hold on
stem(T_sam2,x_samp2);
xlim([0 1]);
ylim([-a a]);
grid on;
hold off;
set(gca,'YTick',(-a:delta:a));     
set(gca,'XAxisLocation','origin'); 
title('De-quantization Signal with fn/2 Hz');
ylabel('Magnitude');
xlabel('Time');

采样信号有两个不同的值,分别为8和23。根据之前中提到的量化规则,数值应该被量化到其子区域的中间点。点代表采样的信号,三角形代表量化后的信号。下面显示了两种不同采样率的结果。

 

5. 信号重建

用如下的代码可以得到去采样信号的估计结果。

M = 1001;                 % de-samping for fs=2fn
for m=1:M
    F(m)=-f_n+2*f_n*(m-1)/(M-1);
    Xsf = 0;
    for n=1:length(x_deqt1)
       x_F(n) = x_deqt1(n)*exp(-2*sqrt(-1)*pi*(n-1)*F(m)*dt_1);
       Xsf = Xsf+x_F(n);
    end
    Xs1(m) = Xsf;
end

L =1001;
for l=1:L
    T(l) = (l-1)/(L-1);
    x_1 = 0;
    for m=1:M
        x_re(m) = ((Xs1(m)*exp(2*sqrt(-1)*pi*F(m)*T(l)))/M);
        x_1 = x_1+x_re(m);
    end
    x_out(l) = x_1;
end
figure;
plot(0:1/1000:1,x_out);
hold on;
plot(t,x);
legend('De-sampling Estimated Signal','Origin Input Signal');
hold off;
set(gca,'XAxisLocation','origin'); 
title('De-sampling Estimated Signal for Samping Rate is 2fn Hz');
ylabel('Magnitude');
xlabel('Time');

从下图不难看出,通过信道进行可靠通信的最大速率已经显示在香农容量中。通过奈奎斯特频率,只要离散系统的奈奎斯特频率高于采样信号的最高频率或带宽,就可以避免混叠现象。输入信号的最小安全采样率为2fn。此外,fs=2fn的去采样信号可以被几乎可以重构。fs = fn/2时有明显的混叠,因为采样率远远低于奈奎斯特频率。

  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值