DSP第一次上机作业

DSP第一次上机作业

一、实验目的

  学习用Matlab实现数字信号处理的方法、程序编写和基本函数的使用。

二、Task 1

2.1 题目要求

  (课本1.10)设连续时间信号为 x a ( t ) = t + cos ⁡ t , 0 ≤ t ≤ t f = 6 s x_{a}(t)=\sqrt{t}+\cos t ,0\le t\le t_{f}=6s xa(t)=t +cost,0ttf=6s  若采样时间间隔T=0.5s,求采样后的离散时间信号;又设A/D变换量化步长为deltax=0.5,求量化后的数字信号,并绘制曲线。对连续时间信号、离散时间信号和数字信号进行比较。

2.2 程序设计

dt=0.001;
tf=6;
t=0:dt:tf;                  %建立连续自变量向量
xa=sqrt(t)+cos(t);          %原始的连续时间信号xa
T=0.5;
n=0:1:tf/T;                 %建立离散自变量向量
xn=sqrt(n*T)+cos(n*T);      %采样后的离散时间信号xn

deltax=0.5;                 %确定量化步长
xq=round(xn/deltax)*deltax; %舍入量化后的数字信号xq

subplot(1,2,1);
plot(t,xa,':'),hold on,grid on      %画出连续时间信号曲线
plot(n*T,xn,'o')                    %画出离散时间信号曲线
plot(n*T,xq,'*'),grid on            %画出数字信号曲线
legend('连续时间信号xa','离散时间信号xn','数字信号xq')   %画出图例标注

subplot(1,2,2)
stairs(n*T,xq),grid on      %画出数字信号采样保持后恢复的连续时间信号曲线
legend("数字信号采样保持")   %画出图例标注

set(gcf,"color","w")        %将本图的背景色设置为白色

2.3 程序结果

Task1结果图

2.4 结果分析

  从图中可以看出,离散时间信号xn是对连续时间信号xa的时域离散化采样,其时间是离散的、幅度是连续的。数字信号xq对离散时间信号xn又进行了一步幅度量化,其时间、幅度都是离散的。数字信号xq是时间离散、幅度量化为有限字长二进制数的信号。

三、Task 2

3.1 题目要求

  输出以下三种信号:

  (1) x ( t ) = sin ⁡ ( 1.25 π t + 0.25 π )    t ϵ [ 0 , 10 ] x(t)=\sin{(1.25\pi t+0.25\pi)}\ \ t\epsilon[0,10] x(t)=sin(1.25πt+0.25π)  tϵ[0,10],连续信号。

  (2)对 x ( t ) x(t) x(t)采样,采样频率 𝑓 s = 0.5 𝐻 𝑧 𝑓_s=0.5𝐻𝑧 fs=0.5Hz,离散时间信号。

  (2)对 x ( t ) x(t) x(t)采样,采样频率 𝑓 s = 2.5 𝐻 𝑧 𝑓_s=2.5𝐻𝑧 fs=2.5Hz,离散时间信号。

  (2)对 x ( t ) x(t) x(t)采样,采样频率 𝑓 s = 4 𝐻 𝑧 𝑓_s=4𝐻𝑧 fs=4Hz,离散时间信号。

3.2 程序设计

dt=0.001;
tf=10;
t=0:dt:tf;                  %建立连续自变量向量
x1=sin(1.25*pi*t+0.25*pi);  %原始的连续时间信号x1

T2=2;                       %信号x2的采样周期(频率0.5Hz)
T3=0.4;                     %信号x3的采样周期(频率2.5Hz)
T4=0.25;                    %信号x4的采样周期(频率4Hz)

n2=0:1:tf/T2;               
x2=sin(1.25*pi*n2*T2+0.25*pi);      %采样后的离散时间信号x2

n3=0:1:tf/T3;               
x3=sin(1.25*pi*n3*T3+0.25*pi);      %采样后的离散时间信号x3

n4=0:1:tf/T4;               
x4=sin(1.25*pi*n4*T4+0.25*pi);      %采样后的离散时间信号x4

subplot(3,1,1);
plot(t,x1,':'),hold on,grid on              %画出连续时间信号曲线x1
plot(n2*T2,x2,'o')                          %画出离散时间信号曲线x2
legend('连续时间信号x1','离散时间信号x2')     %画出图例标注

subplot(3,1,2);
plot(t,x1,':'),hold on,grid on              %画出连续时间信号曲线x1
plot(n3*T3,x3,'o')                          %画出离散时间信号曲线x3
legend('连续时间信号x1','离散时间信号x3')     %画出图例标注

subplot(3,1,3);
plot(t,x1,':'),hold on,grid on              %画出连续时间信号曲线x1
plot(n4*T4,x4,'o')                          %画出离散时间信号曲线x4
legend('连续时间信号x1','离散时间信号x4')     %画出图例标注

set(gcf,"color","w")        %将本图的背景色设置为白色

3.3 程序结果

Task2结果图

3.4 结果分析

  从图中可以看出,随着采样频率越来越高,在连续时间信号一个周期上的采样点越来越多。采样频率 𝑓 s 𝑓_s fs小于 2 𝑓 c = 1.25 H z 2𝑓_c=1.25Hz 2fc=1.25Hz时,离散时间信号x2不能有效表示连续时间信号x1的幅度变化,当采样频率大于 2 𝑓 c 2𝑓_c 2fc时,离散时间信号x2在连续时间信号x1每个周期内采样2个点以上,可以有效表示出连续时间信号x1的幅度变化。由频域分析可知,当 𝑓 s > 2 f c 𝑓_s>2f_c fs>2fc时,采样信号x2的频谱不出现混叠。

四、Task 3

4.1 题目要求

  计算习题2.13(b)中两个离散信号的线性卷积。输出序列 x 1 ( n ) x_1(n) x1(n) x 2 ( n ) x_2(n) x2(n)及卷积后序列 x 3 ( n ) = x 1 ( n ) ∗ x 2 ( n ) x_3(n)=x_1(n)*x_2(n) x3(n)=x1(n)x2(n)的图形。不使用Matlab中的卷积函数,自己编制卷积程序,并和卷积函数计算的结果进行比较。
Task3题目

4.2 程序设计

%不使用卷积函数
x=input('从左向右输入序列x(n)的幅度值矩阵');
h=input('从左到右输入序列h(n)的幅度值矩阵'); 
Start_x=input('输入序列x(n)的起始位置');
Start_h=input('输入序列h(n)的起始位置');
N_x=length(x);%x(n)的长度
N_h=length(h);%h(n)的长度
nx=Start_x:Start_x+N_x-1;
nh=Start_h:Start_h+N_h-1;

subplot(1,3,1);
stem(nx,x,'.');xlabel('n');ylabel('x(n)')    %画出x(n)图形
subplot(1,3,2);
stem(nh,h,'.');xlabel('n');ylabel('h(n)')    %画出h(n)图形

Start=Start_x+Start_h;    %卷积后序列起始位置为x(n)的起始位置加h(n)的起始位置
N=N_x+N_h-1;    %卷积后序列的长度为x(n)的长度Nx与h(n)的长度Nh的和减一
n=Start:Start+N-1;
y=zeros(1,N);   %初始化y

for i=n    %卷积
    sum=0;
    for m=nx
        if i-m>=Start_h && i-m<=Start_h+N_h-1
            y(i-Start+1)=y(i-Start+1)+x(m-Start_x+1).*h(i-m-Start_h+1);
        end
    end
end

fprintf("不使用卷积函数,得到y(n)的值:");
for i=n
    fprintf('%d ',y(i-Start+1));    %输出y(n)的值
end
fprintf('\n');

subplot(1,3,3);
stem(n,y,'.');xlabel('n');ylabel('y(n)')  %画出y(n)图形

%使用卷积函数
y2=conv(x,h);
fprintf("使用卷积函数,得到y2(n)的值:");
for i=1:length(y2)
    fprintf('%d ',y2(i));    %输出y2(n)的值
end
fprintf('\n');

4.3 程序结果

  程序的运行结果如图所示

Task3结果图
  程序的输入和输出如图所示

Task3输入输出

4.4 结果分析

  由运行结果图可知,程序实现了题目要求中的功能,并以图片形式直观地显示出原始序列x(n)、h(n)及卷积结果序列y(n)的横坐标n和对应的幅度值。由输入输出分析可知,作者自主编写的卷积函数输出的序列幅度值与使用卷积函数conv(x,y)所得到的结果相同。

  根据卷积和的定义,两个有限长序列卷积后的起始位置为两原始序列起始位置之和,卷积后序列的长度两原始序列长度之和减一。Matlab中的卷积函数conv(x,y)只有在计算两个起始位置均为0序列的序列的卷积时结果才是准确的,换句话说,该函数仅仅将序列x、y的幅度作卷积,并不考虑原始序列幅度对应的横坐标,得到的卷积结果默认以0作为起始位置,如果想要得到输出卷积序列幅度值对应的横坐标,则需对卷积函数进行修正。而在本题作者自主编写的卷积函数中,使用者输入两个原始序列的同时,也将序列的起始位置输入,从而程序会自动计算得到卷积序列的横坐标n及其对应的幅度值。

4.5 问题及解决

  在编写卷积函数的循环部分时,总是遇到带“数组索引必须为正整数或逻辑值”提示的报错。检查发现程序逻辑并没有错误,经查阅资料得知,Matlab中的数组索引是从1开始,而不像C和Java中从0开始。找到原因后,修改程序便可成功运行得到结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值