ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Goertzel アルゴリズムを使用した DFT の推定

この例は、Goertzel 関数を使用して DFT ベースの DTMF 検出アルゴリズムを実装する方法を示します。

デュアルトーン マルチ周波数 (DTMF) 信号は、音声通信制御の基本であり、番号にダイヤルして交換局を設置する現代の電話技術において世界中で使われています。ボイス メールや、電子メール、テレフォン バンキングのようなシステムでも使われます。

DTMF トーンの生成

DTMF 信号は、周波数が互いに排他的な 2 つのグループから取得された 2 つの正弦波 (トーン) の和で構成されます。このような周波数は、受信機によって高調波が他の DTMF 周波数として間違って検出されるのを防ぐために使用されています。トーンの各ペアは、低群 (697Hz、770Hz、852Hz、941Hz) の 1 周波数と高群 (1209Hz、1336Hz、1477Hz) の 1 周波数で構成され、固有のシンボルを表します。電話パッドのプッシュボタンに割り当てられている周波数は以下のとおりです。

                        1209 Hz   1336 Hz   1477 Hz
                       _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
                      |         |         |         |
                      |         |   ABC   |   DEF   |
              697 Hz  |    1    |    2    |    3    |
                      |_ _ _ _ _|_ _ _ _ _|_ _ _ _ _|
                      |         |         |         |
                      |   GHI   |   JKL   |   MNO   |
              770 Hz  |    4    |    5    |    6    |
                      |_ _ _ _ _|_ _ _ _ _|_ _ _ _ _|
                      |         |         |         |
                      |   PRS   |   TUV   |   WXY   |
              852 Hz  |    7    |    8    |    9    |
                      |_ _ _ _ _|_ _ _ _ _|_ _ _ _ _|
                      |         |         |         |
                      |         |         |         |
              941 Hz  |    *    |    0    |    #    |
                      |_ _ _ _ _|_ _ _ _ _|_ _ _ _ _|

電話パッドの各ボタンの DTMF 信号を生成してプロットします。各信号のサンプルレートは 8 KHz で持続時間は 100 ミリ秒です。

symbol = {'1','2','3','4','5','6','7','8','9','*','0','#'};
[tones, Fs, f, lfg, hfg] = helperDTMFToneGenerator(symbol, false);
helperDFTEstimationPlot1(tones, symbol, Fs, f);

DTMF トーンの再生

例として、電話番号 508 647 7000 のトーンを再生します。シンボル "0" は 11 番目のトーンに対応します。

audid = audiodevinfo(0,Fs,16,1);
if  audid ~= -1
    for i=[5 11 8 6 4 7 7 11 11 11],
        p = audioplayer(tones(:,i),Fs,16,audid);
        play(p)
        pause(0.5)
    end
end

Goertzel アルゴリズムを使用した DTMF トーンの推定

ITU 規格で定義されている DTMF 信号の最小持続時間は 40 ms です。したがって、推定と検出に使用できるサンプルは最大で 0.04 x 8000 = 320 サンプルです。このような短い信号に含まれている周波数を推定するには、DTMF デコーダーが必要です。

この推定の問題に対する共通の対処方法は、7 つの基本トーンと非常に似ている離散時間フーリエ変換 (DFT) のサンプルを計算することです。DFT ベースの方法では、周波数領域で 205 サンプルを使用すると、元の周波数と DFT を推定したポイント間の誤差が最小になります。

Nt = 205;
original_f = [lfg(:);hfg(:)]  % Original frequencies
original_f =

         697
         770
         852
         941
        1209
        1336
        1477

k = round(original_f/Fs*Nt);  % Indices of the DFT
estim_f = round(k*Fs/Nt)      % Frequencies at which the DFT is estimated
estim_f =

         702
         780
         859
         937
        1210
        1327
        1483

元の周波数と DFT を推定したポイント間の誤差を最小にするため、トーンを打ち切り、以降の処理には 205 サンプルまたは 25.6 ms のみを維持します。

tones = tones(1:205,:);

ここで、高速フーリエ変換 (FFT) アルゴリズムを使用して、DFT を計算できますが、この状況では DFT を推定するポイント数が少ないことから Goertzel アルゴリズムがよく使用されます。この場合、Goertzel アルゴリズムは FFT アルゴリズムよりも効果的です。

for toneChoice=1:12,
    % Select tone
    tone=tones(:,toneChoice);
    % Estimate DFT using Goertzel
    ydft(:,toneChoice) = goertzel(tone,k+1); % Goertzel use 1-based indexing
end

各トーンの Goertzel の DFT 振幅の推定値を電話パッドに対応するグリッドにプロットします。

helperDFTEstimationPlot2(ydft,symbol,f, estim_f);

DTMF トーンの検出

デジタル トーンは、上記で推定した 7 つの周波数に存在するエネルギーを測定して検出します。各シンボルは、低群周波数および高群周波数の最大エネルギー成分を使用して分けることができます。

付録

この例では次の補助関数が使用されています。

この情報は役に立ちましたか?