合工大2021信号与系统实验 matlab部分

实验1,波形的叠加

实验内容:
1、利用正弦波序列构造周期矩形脉冲,观察吉布斯现象;
2、观察理解幅度失真和相位失真
3、计算周期矩形脉冲通过RC低通滤波器后的波形。
以下为matlab代码:

clear all;
t=-0.5:0.001:7;
%以下是第一个实验的前三张图,演示k等于不同值时的合成情况
%图1
rectwave=zeros(size(t));
 for k=0:100
   rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;%之前的计算都只算了累加部分,没有算系数,在此处最终取2/Π并加1/2,可简化运算
subplot(3,1,1);
plot(t,rectwave);
title({'HFUT Signal&System2021 Exp-1.1';'k=100'},'FontSize',16);
%图2
rectwave=zeros(size(t));
for k=0:20
   rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
  subplot(3,1,2);
plot(t,rectwave);
title('k=20','FontSize',16);
%图3
rectwave=zeros(size(t));
for k=0:3
   rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
subplot(3,1,3);
plot(t,rectwave);
title('k=3','FontSize',16);

%开始画第一个实验的4、5张图,演示全部元素减半与只有三次谐波减半时的情况
figure(2);
%图4,全部元素变为原来的二分之一
rectwave=zeros(size(t));
for k=0:500
   rectwave=rectwave+0.5*sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
subplot(2,1,1);
plot(t,rectwave);
title({'HFUT Signal&System2021 Exp-1.2';'k=500,HalfSized All'},'FontSize',24);
%图5,只有三次谐波减半
rectwave=zeros(size(t));
rectwave=0.5*sin(3*t)/3
for k=1:500
   rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
subplot(2,1,2);
plot(t,rectwave);
title('k=500,Only HalfSized in k=1','FontSize',24);

%以下是第一个实验的6、7张图,演示了全部相移与只有三次谐波相移的情景
figure(3);
%图6,相移全部
rectwave=zeros(size(t));
for k=0:500
   rectwave=rectwave+sin((2*k+1)*t+(2*k+1)*pi/3)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
subplot(2,1,1);
plot(t,rectwave);
title({'HFUT Signal&System2021 Exp-1.3';'k=500,Phase Shift All'},'FontSize',24);
%图7,只相移三次谐波
rectwave=zeros(size(t));
rectwave=sin(3*t+pi)/3
for k=1:500
   rectwave=rectwave+sin((2*k+1)*t)/(2*k+1);
  end;
rectwave=0.5+(2/pi)*rectwave;
subplot(2,1,2);
plot(t,rectwave);
title('k=500,Only Phase Shift in k=1','FontSize',24);

%以下是第一个实验的最后4张图,演示了波形通过RC滤波器时的变化
%不同的RC值,不同的滤波器
figure(4);
clear all;
t=-0.5:0.001:7;
rc=0.1;
rectRC1=zeros(size(t));
for k=0:500
    b=2*k+1
    rectRC1=rectRC1+(sin(t*b-atan(rc*b))/sqrt(1+(rc*b)^2))/b;
end
rectRC1=0.5+(2/pi)*rectRC1;

rc=0.3;
rectRC2=zeros(size(t));
for k=0:500
    b=2*k+1
    rectRC2=rectRC2+(sin(t*b-atan(rc*b))/sqrt(1+(rc*b)^2))/b;
end
rectRC2=0.5+(2/pi)*rectRC2;

rc=1;
rectRC3=zeros(size(t));
for k=0:500
    b=2*k+1
    rectRC3=rectRC3+(sin(t*b-atan(rc*b))/sqrt(1+(rc*b)^2))/b;
end
rectRC3=0.5+(2/pi)*rectRC3;

rc=3;
rectRC4=zeros(size(t));
for k=0:500
    b=2*k+1
    rectRC4=rectRC4+(sin(t*b-atan(rc*b))/sqrt(1+(rc*b)^2))/b;
end
rectRC4=0.5+(2/pi)*rectRC4;

plot(t,rectRC1);
hold on;
plot(t,rectRC2);
hold on;
plot(t,rectRC3);
hold on;
plot(t,rectRC4);
hold on;
legend('rc=0.1','rc=0.3','rc=1','rc=3');
title({'HFUT Signal&System2021 Exp-1.4';'RC filter'},'FontSize',24);

实验2,时域信号卷积的matlab模拟

实验内容:
编程计算两个信号的卷积。
下为matlab代码:

clear all;
t=-2:0.01:4;
m=-4:0.01:8;
%用卷积函数卷积了f1和f2,输出结果为f3
f1=zeros(size(t));
f2=zeros(size(t));
f3=zeros(size(t));
f1=(-2)*(us(t-0.5)-us(t-2));
f2=(2*t+2).*(us(t+1)-us(t-2));
f3=0.01*conv(f1,f2);
plot(m,f3);
axis([-6,6,-16,16]);
hold on;
plot(t,f1);
axis manual;
hold on;
plot(t,f2);
legend('f3','f1','f2');
title({'HFUT Signal&System2021 Exp-2';'Juan Ji'},'FontSize',24);
%画在了一张图上面


%第二张图是把两个原函数和卷积结果分开画,画三张图
figure(2);
subplot(3,1,1);
axis manual;
plot(t,f1);
title('t-f1','FontSize',20);
subplot(3,1,2);
plot(t,f2);
title('t-f2','FontSize',20);
subplot(3,1,3);
plot(m,f3);
title('m-f3','FontSize',20);

阶梯函数us:

function u = us(t)
  u = 0.*(t<0) + 1.*(t>=0);
endfunction

实验三,连续信号的傅里叶变换

实验内容:
1、 定义一个斜变函数,并用它描述一个脉冲信号;
2、 利用fft()函数对脉冲信号进行傅立叶变换,并经fftshift()调整后绘制其幅度谱和相位谱;
3、 对相位谱进行处理,产生不失真的时移,再利用ifft()恢复信号,并与原信号对比;
4、 通过时移相加,将单脉冲信号变为多脉冲信号,对比单脉冲、5脉冲、11脉冲、101脉冲的频谱,理解周期信号的傅里叶变换

clear all;

%先画原函数的图
figure(1);
t=-1.5:0.001:1.5;
rectwave=zeros(size(t));
rectwave = ur(t+0.5)+9*ur(t+0.1)-20*ur(t)+9*ur(t-0.)+ur(t-0.5);
plot(t,rectwave);
title({'HFUT Signal&System2021 Exp-3.1';'time-value'},'FontSize',16);
xlabel('time','FontSize',16);
ylabel('value','FontSize',16);
hold on;

%接下来是幅度谱和相位谱的绘制
figure(2);
RW=fft(rectwave);
N_fft=length(t);
dT=0.001;
df=1/(dT*N_fft);
Faxis=df*((1:N_fft)-N_fft/2);
%为了把频谱图画出来,需要一个频率的横坐标,就是Faxis。把快速傅里叶变化(fft)之后的数组展开到F轴上


%首先是幅度谱
RW0=fftshift(RW);
RWA=abs(RW0);
subplot(2,1,1);
plot(Faxis,RWA);
title({'HFUT Signal&System2021 Exp-3.2';'Fú Dù Pǔ & Xiàng Wèi Pǔ'},'FontSize',16);
xlabel('frequency','FontSize',16);
ylabel('amplitude','FontSize',16);
hold on;
%相位谱(直接调用angle函数求角度)
Phase=angle(RW)/pi*180;
subplot(2,1,2);
plot(Faxis,Phase);
xlabel('frequency','FontSize',16);
ylabel('phase(π)','FontSize',16);
hold on;

%然后是引入相位移动
figure(3);
%引入学号(ID)相关的相移
ID=89;
Pshift = 0.1*(ID-50)*Faxis;
RWchange=RW0.*exp(j*Pshift);%此处引入相移,以下是逆变换过程
ReRW0=ifft(ifftshift(RWchange));
ReRW=ifft(RWchange);%逆变换结束,开始画图
plot(t,ReRW0);
hold on;
plot(t,ReRW);
hold on;
plot(t,rectwave);
hold on;
legend('using ifftshift','using ifft','origin signal');
title({'HFUT Signal&System2021 Exp-3.3';'change phase & recover'},'FontSize',18);
%结果是,用了ifftshift的图形,就相当于把相位移动转化为了时域的平移
%但是不用shift调整数组顺序,由于ifft的自身运算定义,会把顺序改过的数组直接拿来算,出来一个乱码图
%最后是脉冲信号部分
figure(4);
for k=1:5 	%变为5脉冲信号
    	rectwave5((k-1)*N_fft+1:k*N_fft) = rectwave;
end
RW5_0=fftshift(fft(rectwave5));
RW5_A=abs(RW5_0);
plot(RWA);
hold on;
plot(RW5_A);
legend('5-Pulsed signal','origin signal')
title({'HFUT Signal&System2021 Exp-3.4';'Pulsed Signal & origin signal';},'FontSize',18);
xlabel('frequency','FontSize',16);
ylabel('amplitude','FontSize',16);

figure(5);
for k=1:11 	%变为11脉冲信号
    	rectwave11((k-1)*N_fft+1:k*N_fft) = rectwave;
end
RW11_0=fftshift(fft(rectwave11));
RW11_A=abs(RW11_0);

for k=1:101 	%变为101脉冲信号
    	rectwave101((k-1)*N_fft+1:k*N_fft) = rectwave;
end
RW101_0=fftshift(fft(rectwave101));
RW101_A=abs(RW101_0);

%画三个脉冲的图,然后加一些坐标轴图示
subplot(3,1,1);
plot(RW5_A);
xlabel('frequency','FontSize',16);
ylabel('amplitude','FontSize',16);
title({'HFUT Signal&System2021 Exp-3.4.2';'different pulse series';'k=5'},'FontSize',18);
subplot(3,1,2);
plot(RW11_A);
xlabel('frequency','FontSize',16);
ylabel('amplitude','FontSize',16);
title('k=11','FontSize',18)
subplot(3,1,3);
plot(RW101_A);
xlabel('frequency','FontSize',16);
ylabel('amplitude','FontSize',16);
title('k=101','FontSize',18);

斜变函数ur:

function u = ur(t)
   u = 0.*(t<0)+t.*(t>=0);
endfunction

实验4,模拟抽样

实验内容:
1、利用fft()函数计算一个脉冲信号的傅立叶变换频谱;
2、对信号进行理想冲击抽样,并计算抽样后的频谱;
3、由抽样后的频谱,采用理想低通滤波恢复信号。

clear all;
t=-0.4:0.0002:0.4;

N_fft=length(t);
dT=0.0002;
df=1/(dT*N_fft);
F=df*((1:N_fft)-N_fft/2);

fs=200;
ts=1/fs;
nt=-0.4:ts:0.4;
%定义抽样的频率,然后是相应的其他参数

fc=50;%滤波器的滤波

%先画原信号
t=-0.4:0.0002:0.4;
x1=zeros(size(t));
x2=zeros(size(t));
x=zeros(size(t));
x1=0.02*(1+0.4*cos(60*pi*t));
x2=0.0001+t.^2;
x=x1./x2;
plot(t,x);
title({'HFUT Signal&System2021 Exp-4.1';'origin signal'},'FontSize',20);

%频谱
figure(2);
A=fftshift(fft(x));
y=abs(A);
plot(F,y);
title({'HFUT Signal&System2021 Exp-4.2';'frequency-amplitude'},'FontSize',20);
xlabel('frequency');
ylabel('amplitude');

%抽样画stem棍棍图(时域抽样)
figure(3);
xs=0.02*(1+0.4*cos(60*pi*nt))./(nt.*nt+0.0001);%直接从原函数抽样
stem(xs);
title({'HFUT Signal&System2021 Exp-4.3';'STEM'},'FontSize',20);

%错位相加模拟抽样效果
figure(4);
Rshift=floor(fs/df);
%因为crishift是对数组操作,只能取整数值,除法不一定是整数结果,所以向下取整
for k=-4:4
   A=A+circshift(A,[0 k*Rshift]);
end
y=abs(A);
plot(F,y);
title({'HFUT Signal&System2021 Exp-4.4';'Cuo Wei Xiang Jia'},'FontSize',20);
xlabel('frequency');
ylabel('amplitude');

%滤波
figure(5);
H=(abs(F)

补充实验1,对余弦信号进行抽样

对两个余弦信号及它们的和信号进行抽样,先时域,再频域,再通滤波器。

clear all;
t=-0.4:0.0002:0.4;

N_fft=length(t);
dT=0.0002;
df=1/(dT*N_fft);
F=df*((1:N_fft)-N_fft/2);

fs=200;%抽样频率
ts=1/fs;
nt=-0.4:ts:0.4;
N_ffts=length(nt);
dTs=0.005;
dfs=1/(dTs*N_ffts);
Fs=dfs*((1:N_ffts)-N_ffts/2);

fc=50;%低通滤波器滤波值

x1=zeros(size(t));
x1=cos(30*pi*t);
x2=zeros(size(t));
x2=cos(60*pi*t);
%画原函数的值
figure(1);
subplot(3,1,1);
plot(t,x1);
subplot(3,1,2);
plot(t,x2);
x=x1+x2;
subplot(3,1,3);
plot(t,x);


%频谱
figure(2);
A1=fftshift(fft(x1));
A2=fftshift(fft(x2));
A=fftshift(fft(x));
subplot(3,1,1);
plot(F,abs(A1));
subplot(3,1,2);
plot(F,abs(A2));
subplot(3,1,3);
plot(F,abs(A));

%时域抽样
figure(3);
x1s=cos(30*pi*nt);
x2s=cos(60*pi*nt);
xs=x1s+x2s;
subplot(3,1,1);
stem(x1s);
subplot(3,1,2);
stem(x2s);
subplot(3,1,3);
stem(xs);

%时域抽样的频谱
figure(4);
A1s=fftshift(fft(x1s));
A2s=fftshift(fft(x2s));
As=fftshift(fft(xs));
subplot(3,1,1);
plot(Fs,abs(A1s));
subplot(3,1,2);
plot(Fs,abs(A2s));
subplot(3,1,3);
plot(Fs,abs(As));

%对频谱逆变换
figure(5);
x1r=ifft(ifftshift(A1s));
x2r=ifft(ifftshift(A2s));
xr=ifft(ifftshift(As));
subplot(3,1,1);
plot(nt,x1r);
subplot(3,1,2);
plot(nt,x2r);
subplot(3,1,3);
plot(nt,xr);

%开始进行错位相加
figure(6);
Rshift=floor(fs/df);
for k=-4:4
   A1=A1+circshift(A1,[0 k*Rshift]);
   A2=A2+circshift(A2,[0 k*Rshift]);
   A=A+circshift(A,[0 k*Rshift]);
end
y1=abs(A1);
y2=abs(A2);
y=abs(A);
subplot(3,1,1);
plot(F,y1);
subplot(3,1,2);
plot(F,y2);
subplot(3,1,3);
plot(F,y);
xlabel('frequency');
ylabel('amplitude');

%滤波
figure(7);
H=(abs(F)

补充实验2,对单次矩形波抽样

注,如果是octave或者其他奇怪版本matlab,需要运行特定的包才可以运行这个实验,因为调用了 rectpuls() 函数。

octave请先敲:

pkg load signal

以运行需要的包

以下是主程序:

clear all;
t=-0.4:0.0002:0.4;
N_fft=length(t);
dT=0.0002;
df=1/(dT*N_fft);
F=df*((1:N_fft)-N_fft/2);

fs=200;%抽样频率
ts=1/fs;
nt=-0.4:ts:0.4;
N_ffts=length(nt);
dTs=0.005;
dfs=1/(dTs*N_ffts);
Fs=dfs*((1:N_ffts)-N_ffts/2);

fc=50;%低通滤波器滤波值

%直接用了单次方波信号
%所以就不做时域抽样了

width=5*dT
x1=zeros(size(t));
x1=rectpuls(t,width);
x2=zeros(size(t));
x2=rectpuls(t,(2*width));
%画原函数的值
figure(1);
subplot(3,1,1);
plot(t,x1);
subplot(3,1,2);
plot(t,x2);
x=x1+x2;
subplot(3,1,3);
plot(t,x);


%频谱,可以看出是Sa信号
figure(2);
A1=fftshift(fft(x1));
A2=fftshift(fft(x2));
A=fftshift(fft(x));
subplot(3,1,1);
plot(F,abs(A1));
subplot(3,1,2);
plot(F,abs(A2));
subplot(3,1,3);
plot(F,abs(A));


%开始进行错位相加
figure(3);
Rshift=floor(fs/df);
for k=-4:4
   A1=A1+circshift(A1,[0 k*Rshift]);
   A2=A2+circshift(A2,[0 k*Rshift]);
   A=A+circshift(A,[0 k*Rshift]);
end
y1=abs(A1);
y2=abs(A2);
y=abs(A);
subplot(3,1,1);
plot(F,y1);
subplot(3,1,2);
plot(F,y2);
subplot(3,1,3);
plot(F,y);
xlabel('frequency');
ylabel('amplitude');

%滤波
figure(4);
H=(abs(F)

你可能感兴趣的:(信号处理,matlab,fft,卷积)