在matlab中实现低通滤波器
我想实现一个消除较高频率的滤波器。在这个例子中,我想消除sin曲线并保持线性曲线。在matlab中实现低通滤波器
编辑:
我纠正我的代码,但是,我为滤波实现的功能改变数据的边缘显著这是不能接受的。
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))
第一个问题:
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
fft2来自我从中复制它的代码。但是,这并没有太大的改变。这种转变可能并非必要,但也不会改变它。低通滤波器应该是对称的。我不明白为什么它不应该是对称的。 –
请将新代码添加到您的帖子中 – thang
用我当前的代码更新了修改。我现在使用一个更大的数组作为fft。 –
因为你在做逆变换之前已经采用了abs。 –
你说得对。腹肌只用于绘制需要。然而,过滤目前也不起作用。 –