在matlab中实现低通滤波器

时间:2013-01-25 09:59:10

标签: matlab fft

我想实现一个消除更高频率的滤波器。在这个例子中,我想消除正弦曲线并保持线性曲线。

编辑:

我更正了我的代码,但是我为过滤实现的功能会显着改变数据的边缘,这是不可接受的。

clc; clear all;
xaxis = linspace(1, 10, 1000);
data = xaxis + sin(xaxis*3);
Nf = 2^12;
xAxisf = linspace(-10,10,Nf);
% plot(xaxis, data);

% FFT

xsize = numel(data);    
Xf = zeros([1 Nf]);
indices = Nf/2-floor(xsize/2):Nf/2-floor(xsize/2)+xsize - 1;
Xf(indices) = data;

% Xf = fftshift(Xf);
Xf = fft(Xf);
Xf = fftshift(Xf);

% plot 
Xfa = abs(Xf); plot(xAxisf, Xfa);

% generate super-gaussian filter function
Nf = numel(Xf);    
widthfilter = 0.12;
filterpower = 2;
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower);

% filter
filtertimes = 20;
Xf = Xf .* filter.^filtertimes;

% plot 
Xfa = abs(Xf); plot(Xfa);

% iFFt
Xfs = ifftshift(Xf);
Xif = ifft(Xfs);
% Xif = ifftshift(Xif);
result = abs(Xif);

plot(result(indices))

1 个答案:

答案 0 :(得分:4)

第一期:

    Xf = fftshift(data);     % NOT NEEDED
    Xf = fft(Xf);
    Xf = fftshift(Xf);

不要在fft之前移除数据。只有在fft之后才需要转换。这是因为基数-n(可能是2)fft"抽取"过程中的数据。你之前不需要修理它,因为它没有被毁坏。

第二期:

    Xfs = ifftshift(Xf);
    Xif = ifft2(Xfs);            
    Xif = ifftshift(Xif);   % NOT NEEDED

ifftshift重新抽取数据(撤消ffthift),ifft需要输入。如果输入已经被抽取,则ifft的输出重建原始信号。不要在ifftshift之后。

第三个问题:

    Xfs = ifftshift(Xf);
    Xif = ifft2(Xfs);       % USE ifft INSTEAD OF ifft2     
    Xif = ifftshift(Xiff);

为什么世界上你突然转向2D ifft?

我没有详细查看过滤器代码,但我想指出,如果你想要一个低通滤波器,它需要围绕中点对称。否则你的频率响应不是对称的,你最终会想到一堆虚构的东西。

请改变你的头衔。这不是"傅立叶滤波器"。它是一个使用窗口方法和fft的低通滤波器。窗口,您在频率空间中应用窗口。

好的,已经很晚了,我来回晃动......只是想帮忙。我可以更快地为您编写代码。

如果您要在代码中查找过滤器的效果,那么您将无法做到,因为过滤器的截止频率太高和/或正弦波的频率在你的数据太低。这是一个增加输入正弦波振荡频率的版本:

clc; clear all;
xaxis = linspace(1, 10, 1000);
data = xaxis + sin(xaxis*10);
% plot(xaxis, data);

% FFT
Xf = data;
Xf = fft(Xf);
Xf = fftshift(Xf);

% generate super-gaussian filter function
Nf = numel(data);
xAxisf = linspace(-5,5,Nf);
widthfilter = 0.1;
filterpower = 2;
filter = exp(-(xAxisf.^2./widthfilter^2).^filterpower);

% filter
filtertimes = 1;
Xf = Xf .* filter.^filtertimes;

% plot
Xfa = abs(Xf); plot(Xfa);

% iFFt
Xfs = ifftshift(Xf);
Xif = ifft(Xfs);
result = abs(Xif);

plot(result); hold on; plot(data,'r');
    legend('filtered','data');
上床睡觉晚安!做了我的公共服务:p