【问题标题】:FFT-IFFT. How to sum up the final signal after IFFT?FFT-IFFT。如何总结IFFT后的最终信号?
【发布时间】:2013-07-02 02:51:00
【问题描述】:

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

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

[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);

感谢您的期待, 艾伦切

【问题讨论】:

    标签: filtering signal-processing fft ifft


    【解决方案1】:

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

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

    【讨论】:

    • @ElenChe:这取决于你;)
    【解决方案2】:

    频域过滤充其量是棘手的,最坏的情况是危险的。更好的方法是使用时域滤波器。我有roughly outlined the reasons here

    如果您想消除音频中的 50Hz 线路电源嗡嗡声,更好的方法是使用陷波滤波器。尝试二阶切比雪夫带阻滤波器,我相信它可以在 MATLAB 中轻松设计。您也可以尝试使用 3 阶或 4 阶巴特沃斯带阻滤波器。 (根据一些经验,这些订单和类型只是我的想法)。您将为每个谐波使用一个频段,您可以使用 Matlab functions that apply the filter non-causally,因此它不会影响数据的相位。

    【讨论】:

    • 我不想深入研究过滤器,但似乎我需要这样做,尤其是在我尝试了 FFT-IFFT 但没有成功之后。所以,使用过滤器,只是为了确保我正确理解它。如果我想滤除 50 Hz,我的阻带可以从 48 Hz 开始,通带为 52 Hz。它像这样工作吗?在 Matlab 的帮助中写着我需要系数。能否请您给我指出一个我可以阅读这些内容的来源。谢谢大家!
    • Matlab 具有内置函数来设计许多过滤器。例如,您可以使用 cheby2 函数设计一个 Chebyshev 带阻类型 2 滤波器:mathworks.com/help/signal/ref/cheby2.html
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2012-08-11
    • 1970-01-01
    相关资源
    最近更新 更多