13

マイクからの生のウェーブ ストリームを読み取っています。
(この部分は、スピーカーに送信して素敵なエコーを得ることができるので機能します。)

簡単にするために、Wave データで DTMF トーンを検出したいとします。実際には、DTMF だけでなく、任意の周波数を検出したいと考えています。しかし、私は自分が探している周波数を常に知っています。

FFT で実行してみましたが、高精度の検出が必要な場合はあまり効率的ではないようです (20 ミリ秒しか存在しないとします)。約200ミリ秒の精度で検出できます。

アルゴリズムに関してどのようなオプションがありますか? そのための.Netライブラリはありますか?

4

6 に答える 6

13

DTMF 入力などの特定の周波数を検出しようとしている場合は、Goertzel アルゴリズムを調べてください。Sourceforge には、このアルゴリズムに基づいたC# DTMF ジェネレーター/ディテクターライブラリがあります。

于 2011-01-26T19:25:25.337 に答える
5

Goertzel の非常に優れた実装があります。C# の変更:

private double GoertzelFilter(float[] samples, double freq, int start, int end)
    {
        double sPrev = 0.0;
        double sPrev2 = 0.0;
        int i;
        double normalizedfreq = freq / SIGNAL_SAMPLE_RATE;
        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;
    }

私にとってはうまくいきます。

于 2014-04-16T07:25:50.390 に答える
1

一般的な DTMF 周波数は 200Hz ~ 1000Hz だとしましょう。次に、4 ~ 20 サイクルに基づいてシグナルを検出する必要があります。FFT では、50Hz の倍数の周波数しか検出できないため、私が推測するところには到達しません。これは FFT の組み込み機能であり、サンプル数を増やしても問題は解決しません。もっと賢いことをしなければなりません。

あなたの最善の策は、データを線形最小二乗法で適合させることです

h(t) = A cos (omega t) + B sin (omega t)

特定のオメガ (DTMF 周波数の 1 つ) に対して。詳細(特に統計的有意水準の設定方法) と文献へのリンクについては、こちらを参照してください。

于 2011-01-26T19:40:54.323 に答える
1

これは Goertzel の単純な実装であることがわかりました。まだ機能していませんが(間違った周波数を探していますか?)、とにかく共有したいと思いました. このサイトからのコピーです。

        public static double CalculateGoertzel(byte[] sample, double frequency, int samplerate)
        {
            double Skn, Skn1, Skn2;
            Skn = Skn1 = Skn2 = 0;
            for (int i = 0; i < sample.Length; i++)
            {
                Skn2 = Skn1;
                Skn1 = Skn;
                Skn = 2 * Math.Cos(2 * Math.PI * frequency / samplerate) * Skn1 - Skn2 + sample[i];
            }
            double WNk = Math.Exp(-2 * Math.PI * frequency / samplerate);
            return 20 * Math.Log10(Math.Abs((Skn - WNk * Skn1)));
        }
于 2011-01-27T06:48:36.097 に答える
-3

スペクトル分析

信号から周波数を抽出するすべてのアプリケーションは、フィールド スペクトル解析の下に置かれます。

于 2011-01-26T19:31:21.820 に答える