使用fft的Matlab低通滤波器

马蒂亚斯·波斯皮奇(Matthias Pospiech)

我使用前向和后向fft在matlab中实现了一个简单的低通滤波器。原则上可以使用,但是最小值和最大值与原始值不同。

signal = data;
%% fourier spectrum
% number of elements in fft
NFFT = 1024;
% fft of data
Y = fft(signal,NFFT)/L;
% plot(freq_spectrum)

%% apply filter
fullw = zeros(1, numel(Y));
fullw( 1 : 20 ) = 1;
filteredData = Y.*fullw;

%% invers fft
iY = ifft(filteredData,NFFT);
% amplitude is in abs part
fY = abs(iY);
% use only the length of the original data
fY = fY(1:numel(signal));
filteredSignal = fY * NFFT; % correct maximum

clf; hold on;
plot(signal, 'g-')
plot(filteredSignal ,'b-')
hold off;

生成的图像看起来像这样

在此处输入图片说明

我究竟做错了什么?如果我将两个数据都归一化,则滤波后的信号看起来正确。

本征克里斯

只是提醒自己,MATLAB如何存储以下频率信息Y = fft(y,N)

  • Y(1) 是常数偏移量
  • Y(2:N/2 + 1) 是一组正频率
  • Y(N/2 + 2:end)是负频率的集合...(通常我们将在垂直轴的左侧绘制

为了制作一个真正的低通滤波器,我们必须同时保留低正频率频率。

这是一个使用频域中的乘法矩形滤波器执行此操作的示例,就像您所做的那样:

% make our noisy function
t = linspace(1,10,1024);
x = -(t-5).^2  + 2;
y = awgn(x,0.5); 
Y = fft(y,1024);

r = 20; % range of frequencies we want to preserve

rectangle = zeros(size(Y));
rectangle(1:r+1) = 1;               % preserve low +ve frequencies
y_half = ifft(Y.*rectangle,1024);   % +ve low-pass filtered signal
rectangle(end-r+1:end) = 1;         % preserve low -ve frequencies
y_rect = ifft(Y.*rectangle,1024);   % full low-pass filtered signal

hold on;
plot(t,y,'g--'); plot(t,x,'k','LineWidth',2); plot(t,y_half,'b','LineWidth',2); plot(t,y_rect,'r','LineWidth',2);
legend('noisy signal','true signal','+ve low-pass','full low-pass','Location','southwest')

在此处输入图片说明

完整的低通拟合器做得更好,但是您会注意到重建有点“波浪”。这是因为在频域中使用矩形函数的乘法与在时域中使用sinc函数卷积相同具有正弦函数的卷积将每个点替换为其邻居的加权平均值非常不均匀,因此产生“波动”效应。

高斯滤波器具有更好的低通滤波器特性,因为高斯的傅立叶变换是高斯高斯很好地衰减到零,因此在卷积期间加权平均值中不包括遥远的邻居。这是一个使用高斯滤波器保留正负频率的示例:

gauss = zeros(size(Y));
sigma = 8;                           % just a guess for a range of ~20
gauss(1:r+1) = exp(-(1:r+1).^ 2 / (2 * sigma ^ 2));  % +ve frequencies
gauss(end-r+1:end) = fliplr(gauss(2:r+1));           % -ve frequencies
y_gauss = ifft(Y.*gauss,1024);

hold on;
plot(t,x,'k','LineWidth',2); plot(t,y_rect,'r','LineWidth',2); plot(t,y_gauss,'c','LineWidth',2);
legend('true signal','full low-pass','gaussian','Location','southwest')

在此处输入图片说明

如您所见,这种方式的重建要好得多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

FFT低通滤波器

来自分类Dev

FFT低通滤波器

来自分类Dev

Matlab-在系统上使用低通滤波器

来自分类Dev

在音频上使用低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

FPGA的低通滤波器

来自分类Dev

应用低通滤波器

来自分类Dev

MATLAB中的低通滤波器返回NaN值

来自分类Dev

在Matlab中设计一个低通滤波器

来自分类Dev

关于在Matlab中使用'butter'功能的低通滤波器的问题

来自分类Dev

使用双线性方法将低通滤波器应用于信号-MATLAB

来自分类Dev

在MATLAB中使用imgaussfilt进行的二维高斯低通滤波器

来自分类Dev

将SOX低通滤波器与插孔配合使用

来自分类Dev

使用Pulseaudio在LFE上进行低通滤波器

来自分类Dev

OpenCL中的低通滤波器

来自分类Dev

Python中的低通滤波器

来自分类Dev

低通滤波器和采样频率

来自分类Dev

C中的低通滤波器

来自分类Dev

低通滤波器不起作用

来自分类Dev

固定点的简单低通滤波器

来自分类Dev

高通低通滤波器信号,去除边缘伪像Matlab

来自分类Dev

在C ++中使用3X3低通滤波器对.pgm图像进行卷积

来自分类Dev

如何使用ffmpeg在特定范围内设置低通滤波器?

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

识别过滤器的方法。(低通滤波器/高通滤波器?)

来自分类Dev

优化低通滤波器平滑代码以进行活动识别

来自分类Dev

IIR低通滤波器在C ++中的实现

来自分类Dev

在Python中表示低通滤波器时的直线

来自分类Dev

Matlab FIR滤波器