目录
用fft对信号进行滤波
首先,建立三个模拟信号,它们的频率分别为5、20、50Hz,并将这个三个信号相加合成一个信号,即:
y1 = sin(2*pi*5*t);
y2 = cos(2*pi*20*t);
y3 = sin(2*pi*50*t);
%%合并信号
y = y1 + y2 + y3;
plot(y);
如图所示:
合成信号的图形为:
对该合成的信号进行傅里叶变换得到频谱图得:
图中的频率与实际的频率基本一致,接下来将频谱进行滤波处理,将频率为20Hz的信号滤除:
ffs = find(f>16 & f < 24);
Y(ffs) = 0; %单边
Y(N-ffs+1) = 0;%双边
yfilter = ifft(Y);
figure;
plot(t,yfilter);
滤波后的图形为:
对滤波后的信号进行fft变换求得频谱图得:
从频谱图中可知,20Hz的信号已经被滤除了,达到了滤波的效果。完整的代码:
%%
ds = 500;
t = 0:1/ds:1;
y1 = sin(2*pi*5*t);
y2 = cos(2*pi*20*t);
y3 = sin(2*pi*50*t);
%%合并信号
y = y1 + y2 + y3;
subplot(311)
plot(t,y1);
subplot(312);
plot(t,y2);
subplot(313);
plot(t,y3);
%%y
figure;
plot(t,y);
%%fft
N = length(y);
f = (ds/N)*(0:N/2-1);
Y = fft(y);
%%
figure;
plot(f,abs(Y(1:N/2)));
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|Y(f)|')
%%filter
ffs = find(f>16 & f < 24);
Y(ffs) = 0; %单边
Y(N-ffs+1) = 0;%双边
yfilter = ifft(Y);
figure;
plot(t,yfilter);
%%
Yfilter = fft(yfilter);
figure;
plot(f,abs(Yfilter(1:N/2)));
title('Single-Sided Amplitude Spectrum of S(t)')
xlabel('f (Hz)')
ylabel('|Y(f)|')
在下采样前进行滤波
此示例说明如何在下采样前进行滤波以减轻混叠造成的失真。
可以使用 decimate 或 resample 以通过一个函数进行滤波和下采样。也可以先对数据进行低通滤波,然后使用 downsample。创建基带频谱支持大于 π 弧度的信号。使用 decimate 以在下采样之前通过 10 阶 Chebyshev I 类低通滤波器对信号滤波。
创建信号并绘制幅值频谱。
f = [0 0.2500 0.5000 0.7500 1.0000];
a = [1.00 0.6667 0.3333 0 0];
nf = 512;
b = fir2(nf-1,f,a);
Hx = fftshift(freqz(b,1,nf,'whole'));
omega = -pi:2*pi/nf:pi-2*pi/nf;
plot(omega/pi,abs(Hx))
grid
xlabel('\times\pi rad/sample')
ylabel('Magnitude')
如图所示:
使用 10 阶 Chebyshev I 类低通滤波器对信号进行滤波,然后以 2 为因子下采样。绘制原始信号以及经过滤波和下采样的信号的幅值频谱。低通滤波器减少了区间 [−π/2,π/2] 之外的混叠失真量。
y = decimate(b,2,10);
Hy = fftshift(freqz(y,1,nf,'whole'));
hold on
plot(omega/pi,abs(Hy))
legend('Original','Downsampled')
如图所示: