MATLAB——信号的采样与恢复

**题目:**已知一个连续时间信号
在这里插入图片描述

其中:f0=1HZ,取最高有限带宽频率fm=5f0。分别显示原连续时间信号波形和
在这里插入图片描述

3种情况下抽样信号的波形。并画出它们的幅频特性曲线,并对采样后的信号进行恢复。

step1.绘制出采样信号
这部分相对简单,代码解释直接写在下面程序里。主要来说,通过for循环进行采样,采样后,根据采样频率间隔绘制出采样之后的离散信号。
代码1

%根据题目写出已知信息
f0=1;
fm=5*f0;
f=sin(2*pi*f0*t)+(1/3)*sin(6*pi*f0*t);
%设置时间区间和步进
t=-2:0.01:2;
%绘制出原始,未经采样的图像
subplot(411);
plot(t,f);
title('原始信号')

%for循环绘制不同采样频率下的信号
for i=1:1:3;
    fs=i*fm;
    Ts=1/fs;
    %Ts是采样周期,也是采样间隔
    n=-2:Ts:2;
    %写出采样后的离散信号
    f1=sin(2*pi*f0*n)+(1/3)*sin(6*pi*f0*n);
    %绘制剩下三个采样图像
    subplot(4,1,1+i);
    %以实心圆进行绘制
    stem(n,f1,'filled');
    

end

运行结果1
MATLAB——信号的采样与恢复_第1张图片
step2:绘制幅频特性曲线
这里主要使用的方法是傅里叶变换。根据傅里叶变换的公式,确定相关的变量。
代码2

%写出已知信息
f0=1;
fm=5*f0;
fs1=2*fm;
t=-2:0.01:2;
x=sin(2*pi*f0*t)+(1/3)*sin(6*pi*f0*t);

%对原始信号进行傅里叶变换
N=length(t);
k=0:N-1;%序号
wm=2*pi*fm;
w1=k*wm/N; %频域对应的角频率,wm/N可以理解为频率间隔,kwm/N,第k个点对应的频率
dt=1/fm %时域时间间隔
X=x*exp(-j*t'*w1)*dt%矩阵形式计算傅里叶变换
subplot(4,1,1);
plot(w1/(2*pi),abs(X));
axis([0,max(3*fm),1.1*min(abs(X)),1.1*max(abs(X))]);

%绘制fm,2fm,3fm采样频率下的频谱,对离散信号进行傅里叶变换
%写出离散信号后,进行傅里叶变换
for i=1:3; 
fs=i*fm;
 fs=i*fm;Ts=1/fs;
    n=-2:Ts:2;
    xs=sin(2*pi*f0*n)+1/3*sin(6*pi*f0*n);
    N=length(n);
    ws=2*pi*fs;
    k=0:N-1;
    n1=0:N-1;
    WN=exp(-2*pi*j/N);
    XS=xs*WN.^(n1'*k);
    
    w=k*ws/N;
    Xs=xs*exp(-j*n'*w)*Ts;
    %绘制关于频率变化的幅度谱(FT),绘制关于采样点的幅值和相角用DFT
    subplot(4,1,1+i);plot(w/(2*pi),abs(Xs));
    axis([0,max(4*fm),1.1*min(abs(Xs)),1.1*max(abs(Xs))]);
end

运行结果
MATLAB——信号的采样与恢复_第2张图片
step3.抽样信号的恢复
这里信号的恢复,主要采用的方式是插值法。时域卷积是用时域抽样信号xs(t)与理想滤波器系统的单位冲激响应h(t)进行卷积积分来求解。卷积积分的公式通过推导化简为内插公式 。在这里插入图片描述
特别要注意生成 t − n T s t-nTs tnTs的这个过程,要很好的利用矩阵的规律。
目的:我们最后得到的应该是一个 1 行 ( 3 ∗ T 0 ) / T s 列 1行(3*T0)/Ts列 1(3T0)/Ts的行向量。而抽样后的序列xs也是一个 1 行 ( 3 ∗ T 0 ) / T s 列 1行(3*T0)/Ts列 1(3T0)/Ts的行向量,那么就要求 s a sa sa ( 3 ∗ T 0 ) / T 行乘以 ( 3 ∗ T 0 ) / T s 列 (3*T0)/T行乘以(3*T0)/Ts列 (3T0)/T行乘以(3T0)/Ts的矩阵。而且 s a sa sa取决于 t − n T s t-nTs tnTs
故借助该行代码生成 t − n T s t-nTs tnTs

  TN=ones(length(n),1)*t1-n'*Ts*ones(1,length(t1));

完整代码

%x信号重建
%写出已知条件
f0=1;
T0=1/f0;
fm=5*f0;
Tm=1/fm;%时域时间间隔
t=0:0.1:3*T0;
x=sin(2*pi*f0*t)+(1/3)*sin(6*pi*f0*t);
subplot(411);
plot(t,x);


%生成采样后的信号
for i=1:1:3
    fs=i*fm;
    Ts=1/fs;
    t1=0:Ts:3*T0;
    xs=sin(2*pi*f0*t1)+(1/3)*sin(6*pi*f0*t1);
    %生成t-nTs矩阵用于构建插值函数
    n=0:(3*T0)/Ts;
    TN=ones(length(n),1)*t1-n'*Ts*ones(1,length(t1));
    x1=xs*sinc(2*pi*fs*TN);
    
    subplot(4,1,1+i);
    plot(t1,x1);
     axis([min(t1),max(t1),1.1*min(x1),1.1*max(x1)])
end

运行结果
MATLAB——信号的采样与恢复_第3张图片
结果分析
由此次实验可以发现,当采样频率大于信号频率的两倍时,才可以进行恢复,也就是进行无失真传输。
经验
学习MATLAB往往先要想的是,我要达成的目的是什么,这个过程中,我需要用到的函数或者是公式是什么,为了实现这个函数的功能,我需要定义哪些变量。也就是说程序往往是先构建框架,再去填充内容。
此外,在这个过程中本人最怕的是矢量长度必须相等,索引超出矩阵维度。今天信号的恢复那里就卡了一下午,所以说,赤裸裸的教训,每一个变量都应该注意他的维度。

你可能感兴趣的:(MATLAB,matlab,图像处理,计算机视觉)