一个使用matlab对正弦信号进行FIR滤波及频谱分析的学习笔记,本文使用的是窗函数法滤波。
正弦函数的频率为95和105
Fs=5120; % 采样率
N=1024; % 采样点
dt=1.0/5120.0;
T=dt*N;
t=linspace(0,T,N);
x=10*sin(2*pi*95*t)+10*sin(2*pi*105*t); % 原始信号
figure(1);
plot(t,x);grid on;
title('原始信号');
xlabel('时间');
ylabel('幅值');
w1=rectwin(N); % 矩形窗
subplot(2,2,1);plot(t,w1');
title('矩形窗');
z1=2*w1'.*x; % 加矩形窗信号
subplot(2,2,3);plot(t,z1);
title('加矩形窗信号');
w2=blackman(N); % 布莱克曼窗
subplot(2,2,2);plot(t,w2');
title('布莱克曼窗');
z2=2*w2'.*x; % 加布莱克曼窗信号
subplot(2,2,4);plot(t,z2);
title('加布莱克曼窗信号');
函数加窗就是将窗函数乘到原信号上,从上图可以看到,加矩形窗的结果就是截取出窗宽度的信号;而布莱克曼窗前后会将信号衰减掉。
y1=fft(z1,N);
y2=fft(z2,N);
f=linspace(0,Fs/2,N/2);
A1=abs(y1)/(N/2); % 加矩形窗幅值谱
subplot(2,1,1);plot(f,A1(1:N/2));
title('加矩形窗幅值谱');
xlabel('频率');
ylabel('幅值');
axis([0 200 0 20]);
A2=abs(y2)/(N/2); % 加布莱克曼窗幅值谱
subplot(2,1,2);plot(f,A2(1:N/2));
title('加布莱克曼窗幅值谱');
xlabel('频率');
ylabel('幅值');
axis([0 200 0 20]);
加矩形窗后的信号跟原信号是一样的,所以其频谱就是原信号的频谱,可以看到有两个峰值,就是原信号里正弦信号的频率;而加了布莱克曼的信号频率已经不是95和105了
clear;
Fs=5120; % 采样率
N=1024; % 采样点
dt=1.0/5120.0;
T=dt*N;
t=linspace(0,T,N);
x=10*sin(2*pi*95*t)+10*sin(2*pi*105*t); % 原始信号
figure(1);
plot(t,x);grid on;
title('原始信号');
xlabel('时间');
ylabel('幅值');
figure(2);
w1=rectwin(N); % 矩形窗
subplot(2,2,1);plot(t,w1');
title('矩形窗');
z1=2*w1'.*x; % 加矩形窗信号
subplot(2,2,3);plot(t,z1);
title('加矩形窗信号');
w2=blackman(N); % 布莱克曼窗
subplot(2,2,2);plot(t,w2');
title('布莱克曼窗');
z2=2*w2'.*x; % 加布莱克曼窗信号
subplot(2,2,4);plot(t,z2);
title('加布莱克曼窗信号');
% 谱分析
figure(3);
y1=fft(z1,N);
y2=fft(z2,N);
f=linspace(0,Fs/2,N/2);
A1=abs(y1)/(N/2); % 加矩形窗幅值谱
subplot(2,1,1);plot(f,A1(1:N/2));
title('加矩形窗幅值谱');
xlabel('频率');
ylabel('幅值');
axis([0 200 0 20]);
A2=abs(y2)/(N/2); % 加布莱克曼窗幅值谱
subplot(2,1,2);plot(f,A2(1:N/2));
title('加布莱克曼窗幅值谱');
xlabel('频率');
ylabel('幅值');
axis([0 200 0 20]);