首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FFT-IFFT。如何对IFFT后的最终信号求和?

FFT-IFFT。如何对IFFT后的最终信号求和?
EN

Stack Overflow用户
提问于 2013-07-04 15:42:07
回答 2查看 2.8K关注 0票数 1

我使用Matlab执行FFT-IFFT,以便从我的信号中提取50 Hz及其谐波。为此,我将信号分解为1024个样本的窗口,并对其执行FFT。我也做了50%的重叠。FFT完成后,我取出这些谐波,并做IFFT,以获得滤波后的数据。我的问题是:如何将所有具有重叠的窗口相加以获得信号?

我的代码如下。正如您所看到的,我在每个窗口上执行FFT-IFFT,但不知道如何将所有窗口重新组合在一起。

代码语言:javascript
复制
[y, Fs, nbits] = wavread([fileName]);                    %read the data
[noSamples, noChannels] = size(y);
N = 1024;                                                 %window length 2^10
winLength=N; 
Fres = Fs/N;                                              % resolution frequency
nofWins = floor(noSamples/winLength);                     % No of full windows
noWins = round((100/50)*nofWins - 1);                     % rounded no of windows
yPaddedLength = floor(noWins*0.5*winLength + winLength);  % padding wth 0
yZeroPadded =[y zeros(1, (yPaddedLength - noSamples))];   % padded signal y
nofWinsPadded = round(yPaddedLength/winLength);
noWinsPadded = round((100/50)*nofWinsPadded - 1);         % no of padded windows

odd = true;
for k = 1:(noWinsPadded-1)
    j = floor(0.5*k);
    at = j*winLength + 1;
    overlapWinLength=floor(0.5*winLength);
    range = at:(at + winLength - 1);

if odd
    data = yZeroPadded(range, 1);
    data_sum=sum(data);                                    % from now on - to perform 
                                                           % DC removal
    data_average=data_sum/N;
    data=data-data_average;

else
   data = yZeroPadded(range+overlapWinLength, 1);
    data_sum=sum(data);
    data_average=data_sum/N;
    data=data-data_average;
end;

odd=~odd;
    spectrum = fft(data);
    F=length(spectrum);
    F=spectrum;
    F(10:11)=zeros;                         % FFT No equals to zero removes harmonics
    F(17:18)=zeros                          % and so on
filtered_signal=IFFT(F);

在期待中感谢你,Elen Che

EN

回答 2

Stack Overflow用户

发布于 2013-07-04 22:55:55

频域中的滤波往好了说是棘手的,往坏了说则是危险的。更好的方法是使用时域滤波器。我有roughly outlined the reasons here

如果您试图消除音频中的50 is线路功率噪声,更好的方法是使用陷波滤波器。尝试一个二阶Chebyshev带阻滤波器,我相信它可以很容易地在MATLAB中设计。你也可以尝试三阶或四阶巴特沃斯带阻滤波器。(根据一些经验,这些订单和类型都是我想不到的)。您将为每个谐波使用一个频带,并且可以使用Matlab functions that apply the filter non-causally,因此它不会影响数据的相位。

票数 2
EN

Stack Overflow用户

发布于 2013-07-04 15:45:39

如果你所做的只是过滤,那么你就不应该创建重叠的输入窗口。

一旦你解决了这个问题,那么一个常用的重构方法就是overlap-and-add

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17464520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档