沿时间检测缓冲区中的频率

时间:2015-04-30 05:38:48

标签: windows-phone-8 signal-processing frequency-analysis goertzel-algorithm

如果我将一系列频率蜂鸣声录制到缓冲区中,例如:

15kHz持续50ms,17k持续50ms然后继续,是否有任何方法可以沿着时间“走”并解码此频率(使用goertzel或其他东西)?

嘿,这是一个更新,我添加了一个代码,显示我如何找到我检查的声音缓冲区中的第一个分隔符。如果我记录5秒的缓冲区(我记录到流缓冲区而不是文件)第一个片段需要30秒才能分析起始分隔符开始的索引。我认为这是非常新手......必须找到更好的解决方案。谢谢 (每个分隔符的持续时间为0.2秒)就像那样 - 开始分隔符= 12KHz,1 = 13k,0 = 14k,结束分隔符= 15k

        double max_power = 0;
        int max_power_index = 0;
        double DelimiterSamplesCount = SampleRate * DelimiterTime;
        float[] samples32array = samples32.ToArray();

        //Searching For Delimiter
        for (int i = 0; i < (samples32array.Length); i++) //Delimiter Samples Length = SampleRate*DelimiterTimeLength,( i.e: 44100*0.2=8820 samples)
        {
            if ((i + (int)DelimiterSamplesCount - 1) > samples32array.Length) break;
            double power = Goertzel.GoertzelFilter(samples32array, StartDelimiterFreq, i, i + (int)DelimiterSamplesCount - 1);
            if(power > max_power)
            {
                max_power = power;
                max_power_index = i;
            }
        }

我的Goertzel就是这样:

public static double GoertzelFilter(float[] samples, double freq, int     start, int end)
    {
        double sPrev = 0.0;
        double sPrev2 = 0.0;
        int i;
        double normalizedfreq = freq / 44100;
        double coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);
        for (i = start; i < end; i++)
        {
            double s = samples[i] + coeff * sPrev - sPrev2;
            sPrev2 = sPrev;
            sPrev = s;
        }
        double power = sPrev2 * sPrev2 + sPrev * sPrev - coeff * sPrev * sPrev2;
        return power;
    }

1 个答案:

答案 0 :(得分:1)

如果您知道频率和持续时间的集合,那么一组滑动Goertzel滤波器是构建简单解调器的良好开端。比较和扫描这些滤波器之间的峰值差异是一个比检查特定幅度输出更好的决策标准。