Matlab代码:采用仿真信号验证fft、ifft、滤波和加窗处理

一、仿真信号设置

        单频15 Hz,调频100-200 Hz、800-1000 Hz和3000-3500 Hz;幅值均为1;时长设置为1秒;采样频率为10 kHz。

fs = 10e3;         
t = (0:fs-1)/fs;
s1 = sin(2*pi*15.*t);                
s2 = sin(2*pi*(100+100.*t).*t);
s3 = sin(2*pi*(800+200.*t).*t);
s4 = sin(2*pi*(3000+500.*t).*t);
data = s1+s2+s3+s4;     %仿真信号
N = length(data);    %信号长度

二、傅里叶变换(fft)

f = fs*(1:(N/2))/N;  %频率变换
fre_S = fft(data,N)
Y = 2*abs(fre_S(2:N/2+1)) /N;   %幅值变换
plot(f,Y);    
图1

三、带通滤波后做fft

%%%%%% 带通滤波
fup = 4000;   %带通滤波频率上限
fdown = 50;   %带通滤波频率下限     
filterNum = 4;              
freq = [fdown fup];         
Wn = freq/(fs/2);
[b,a] = butter(filterNum,Wn);
filter_data = filter(b,a,data);

%%%%%% fft
fre_x1= fft(filter_data,N);   
Ydata_x1 = 2*abs(fre_x1(2:N/2+1)) / N;       
fdata = fs*(1:(N/2))/N;
plot(fdata,Ydata_x1);
图2

四、加窗

        加窗的作用是为了防止频谱泄露,至于是否加窗这个取决于你所分析的信号,即加窗这个步骤是非必要的。

x1 = filter_data';   %滤波信号  
w = hanning(N);     %汉宁窗 
x2 = 1.633*x1.*w;    %加窗后的时域信号 
fre_x2= fft(x2,N);   
Ydata = 2*abs(fre_x2(2:N/2+1)) /N;  %幅值变换      
fdata = fs*(1:(N/2))/N;   %频率变换
plot(fdata,Ydata);
图3
图4

五、fft和加窗处理(增加fft的点数)

nfft = 2^nextpow2(N);  %增加fft点数
Y1 = fft(x1,nfft);   
Y2 = fft(x2,nfft);
f2= [0:fs/nfft:fs/2];
figure;
plot(f2,abs(Y1(1:nfft/2+1) *2/nfft));
hold on;
plot(f2,abs(Y2(1:nfft/2+1) *2/nfft));
图5  未加窗和加窗的频谱对比

六、逆傅里叶变换(ifft)

X1=ifft(fre_x1);   %未加窗信号
X2=ifft(fre_x2);   %加窗信号
y1=ifft(Y1,nfft);  %未加窗,增加fft点数
y2=ifft(Y2,nfft);  %加窗,增加fft点数

figure
plot(real(X1));
hold on;
plot(x1);
legend('X1','x1');

figure
plot(real(X2));
hold on;
plot(real(y1));
hold on;
plot(real(y2));
legend('X2','y1','y2');
图6  ifft后的信号和原始信号的时域波形对比
图7

七、ifft除以窗逆变换

X22 = X2./w/1.633;
y22 = y2(1:N)./w/1.633;
rmse5 = sqrt(sum((X22 - x1).^2)/N)  %均方根误差
rmse6 = sqrt(sum((y22(1:N) - x1).^2)/N)

%%%% 输出误差
% rmse5 = 1.7691e-11
% rmse6 = 9.7542e-12

        综上所述,fft、ifft、滤波和加窗处理是信号处理中常用的方法。其中,针对fft和ifft之间的相互变换,如果fft变换中乘以系数和加窗,那么ifft时相应的除以窗和系数逆变换回去;fft中增加点数的作用是提高频谱的分辨率,也就是频率划分得更细。至于加窗的这一处理,上述的仿真信号明显不需要加窗的,加窗是为了防止频谱泄露的,实际中是因分析信号而定的,不是为了加窗而加窗。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是哆啦A梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值