反向 STFT 会导致不需要的噪声尖峰吗?

信息处理 fft 声音的 噪音 stft IFFT
2022-02-25 17:23:19

我有一个(音频)信号。我连续应用 STFT,在应用一定幅度阈值后,我正在做逆 STFT 来重建信号。但是在整个重建的音频中,我得到了一些不需要的迷你噪声尖峰。

在时频域中,如果它超过某个阈值,我只是将值归零。我也在做 STFT 时应用 Hanning 的窗口。里面有什么问题?

这个想法很简单:

for(int i=0; i<total_samples ; i+=hopsize){
    for(int j=0; j<frame.size(); j++){
        apply_hanning_window(frame[j]);
    }

    stft_frame = apply_STFT(frame);
    reconstructed_overlapping_frame = apply_INVERSE_STFT(stft_frame);

    reconstructed_audio.push(reconstructed_overlapping_frame);
}

apply_INVERSE_STFT(stft_frame){
    Iterate_over_fullframe(){
        if(stft_frame[i].magnitude > threshold) stft_frame[i] = 0; // applying magnitude threshold
        // I can also apply frequency threshold here
    }
    filtered_frame = do_INVERSE_STFT(stft_frame):
    return filtered_frame;
}

如果我做错了什么,请告诉我。谢谢

2个回答

您正在创建时域别名。

对于静态过滤器,您需要零填充并使用重叠添加或重叠保存。对于时变滤波器,您应该减小跳数大小并对正向和逆变换进行平方根窗口化。

通常,将频谱中的线归零是一个坏主意(请参阅为什么通过将 FFT 箱归零来进行滤波是个坏主意?)并且在频域中进行时变滤波器很复杂,并且需要一些权衡和调整。

你被循环卷积咬了。将几个 bin 归零的脉冲响应相当长,例如 M。线性卷积的结果长度为 N+M-1;这不适合长度为 N IFFT 结果。因此,卷积的结束会循环地弄乱每帧结果的开始(可能还有其余部分),这会在帧之间产生不连续性。

尝试重叠添加/保存/报废 FFT/IFFT 过滤。有关详细信息,请参阅此问题您需要确定频域变化的脉冲响应长度。