使用FFT确定低频信号的幅度

我对信号处理是全新的,并且正在试图制作一个能够显示PCM(WAV)文件中低频信号幅度的程序。

到目前为止,我已经能够读入WAV文件,并将float组(实际上是一个多维数组,每个通道一个,但我们只考虑逐个通道的基础) float数据从WAV获取的声音文件。 每个数据点都是一个幅度。 总之,我有声波的时域表示。 我用这个来绘制波形相对于时间的幅度图,如下所示:

相对于时间的幅度

我的目标是完全相同,但只显示低于特定值(例如350Hz)的频率。 清楚的是,这并不是我想要在频域中显示图形(即在快速傅立叶变换之后)。 我想显示相同的幅度与时间的关系图,但是对于[0,350Hz]范围内的频率。

我正在寻找一个可以做到的功能:

// Returns an array of data points that contains
// amplitude data points, after a low pass filter
float[] low_pass_filter(float[] original_data, float low_pass_freq=350.0)
{
    ...
}

我已经阅读过FFT,阅读Chris Lomont的FFT代码,并理解低通滤波器背后的“理论”,但我很难理解如何真正实现这个特定功能(以上)。 任何帮助(+解释)将不胜感激!


我结束了使用这个非常好的例子。 我把它包装得更好一些,最后是:

    /// <summary>
    /// Returns a low-pass filter of the data
    /// </summary>
    /// <param name="data">Data to filter</param>
    /// <param name="cutoff_freq">The frequency below which data will be preserved</param>
    private float[] lowPassFilter(ref float[] data, float cutoff_freq, int sample_rate, float quality_factor=1.0f)
    {
        // Calculate filter parameters
        float O = (float)(2.0 * Math.PI * cutoff_freq / sample_rate);
        float C = quality_factor / O;
        float L = 1 / quality_factor / O;

        // Loop through and apply the filter
        float[] output = new float[data.Length];
        float V = 0, I = 0, T;
        for (int s = 0; s < data.Length; s++)
        {
            T = (I - V) / C;
            I += (data[s] * O - V) / L;
            V += T;
            output[s] = V / O;
        }

        return output;
    }

正常和低通波形的输出:

并隔离常规波形与低通波形:

链接地址: http://www.djcxy.com/p/62149.html

上一篇: Determine amplitude of low frequency signals using FFT

下一篇: bandpass FIR filter