0

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

编辑:

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

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))
4

1 回答 1

4

首要问题:

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

不要在 fft 之前对数据进行 fftshift。仅在 fft 之后才需要转移。这是因为基数 n(可能为 2)fft 在过程中“抽取”了数据。您之前不需要修复它,因为它还没有被淘汰。

第二题:

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

ifftshift 重新抽取数据(撤消 fftshift),ifft 需要将其作为输入。如果输入已经被抽取,则 ifft 的输出会重建原始信号。之后不要换档。

第三题:

    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

于 2013-01-25T10:30:40.420 回答