我执行FFT-IFFT以便使用Matlab从我的信号中取出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);
期待感谢你, Elen Che
答案 0 :(得分:2)
频域滤波充其量是棘手的,最坏的情况是危险的。更好的方法是使用时域过滤器。我有roughly outlined the reasons here。
如果您试图从音频中消除50Hz线路功率嗡嗡声,更好的方法是使用陷波滤波器。尝试二阶Chebyshev带阻滤波器,我相信可以在MATLAB中轻松设计。您也可以尝试使用3阶或4阶Butterworth带阻滤波器。 (基于一些经验,这些订单和类型只是我的头脑)。您将为每个谐波使用一个波段,您可以使用Matlab functions that apply the filter non-causally,因此它不会影响数据的相位。
答案 1 :(得分:1)
如果您所做的只是过滤,那么您不应该创建重叠的输入窗口。
一旦你修复了它,那么重建的常用方法是overlap-and-add。