在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)) 
+1

因为你在做逆变换之前已经采用了abs。 –

+0

你说得对。腹肌只用于绘制需要。然而,过滤目前也不起作用。 –

第一个问题:

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

+0

fft2来自我从中复制它的代码。但是,这并没有太大的改变。这种转变可能并非必要,但也不会改变它。低通滤波器应该是对称的。我不明白为什么它不应该是对称的。 –

+0

请将新代码添加到您的帖子中 – thang

+0

用我当前的代码更新了修改。我现在使用一个更大的数组作为fft。 –