技術研究開発
技術研究開発の案件について、このページにて紹介します。
DTMF信号検出についての研究開発 (2021/03/15) | |
---|---|
概要 | DTMF信号の生成は完了したため、DTMF信号検出の研究開発を行いました。 FFTを使用することなく、計算が簡易な「正弦波の直交ベクトル分解」を使用することで 良好にDTMF信号を検出することが出来ましたので、ここで紹介します。 |
研究開発方針 | 今回もDTMF信号生成と同じくPICマイコンの使用を考えています、
そのため、このPICマイコンにより検出のための条件がある程度制約されます。 ・信号のサンプリング周期:40μsec ・サンプル数:256 ・振幅の分解能:8ビット ・周波数成分の検出方法:正弦波の直交ベクトル分解による振幅比較方式 A/D変換には最大約30μsec(実測値)必要であるため、サンプリング周期はこれ以上の周期である必要があります。 マイコンにはRAMが1kバイトしか無いため、これをサンプルデータ保存用に1/4、演算用に3/4割り当てます。 マイコンには10ビットのA/Dが内蔵されていますが、RAM容量の関係で下位2ビットを捨てて8ビットとします。 上記条件によりDTMFの最小周波数の697Hzであっても7周期分のサンプルが可能です。 また、最大周波数の1633Hzの一周期のサンプル数は15となります。 サンプル時間は 40(μsec)×256=10.24(msec) であり、信号送出時間の規格 50msec以下のため 信号送出時間内にサンプリングは終了します。 周波数成分の検出方法としては最初はFFTを考えていましたが、ちょと難解で マイコンでの処理に無理があると考えて、「正弦波の直交ベクトル分解」を使用することにしました。 「正弦波の直交ベクトル分解」とは、正弦波は角周波数の同じ直交(位相差がPI/2)する2つの正弦波に分解できるという ものです。DTMF信号の場合、含まれている周波数成分は決まった8個の周波数であるため 受信したDTMF信号を順番にこの8個の周波数での直交するベクトルに分解します。 (いわゆる実数部と虚数部の振幅を算出します。) 実数部と虚数部を三平方の定理により それぞれの周波数の振幅(ベクトルの長さ)を計算します。 計算結果から低群、高群それぞれにおいて最も振幅の大きい周波数を探し、 その周波数の組み合わせによりダイヤル番号を特定します。 |
基礎情報 | 正弦波の直交ベクトル分解 例として三相交流をベクトル分解してみます。 ![]() 上図は三相交流を10度ごとに360度サンプリングしたデータをグラフにしたものです。 このサンプリングしたデータからA相を基準としてA相(実数部)およびA相と直交(虚数部)したベクトル成分を A相(自分自身)、B相、C相の各相について計算します。 実際の具体的な計算としては、一定時間間隔でサンプリングした離散値系のデータなので、A相と同相の 0~1の振幅の方形波を掛けて36個分を総和して実装部を求めます。 また、虚数部はA相から位相が90度ズレた0~1の振幅の方形波を掛けた36個分を総和して求めます。 これらの計算結果および結果をベクトル表示したものが下表および下グラフになります。 ![]() ![]() A相を基準として、位相が120度のB相、240度のC相がきれいにベクトル表現されています。 |
研究開発内容 |
机上での事前確認 DTMF信号は実際は正弦波ではなく2つの周波数が合成されたものなので、 実際に上記理論によりDTMF信号を検出可能かについてエクセル上で確認しました。 確認結果は下図になります。 (エクセルで計算したダイヤル7の場合の各周波数の振幅値グラフ) ![]() ダイヤル7に含まれる852Hzと1209Hzの周波数成分を良好に検出しています。 回路図 回路図のダウンロード 入力されたDTMF信号が検出可能なレベルまで達していない場合を考慮して 2倍のアンプで増幅しています、またマイコンのADの入力電圧範囲が 0Vから5Vまでなので、2.5Vのレベルシフトを行ってマイコンのADポートに接続しています。 DTMFの検出結果の表示用として8文字2行のLCDを実装しています。 またソフトのデバッグ用として計算の途中結果等をパソコンで確認できるように USBポートを付けています。 マイコンのソフトウエア マイコンのAD入力に2Vp-p以上の信号が入力されると 約10msec間データを40μsec間隔でサンプリングします。 サンプリングデータを机上でのエクセルで行った演算と同じ計算を行なっています。 00h~FFhまで変動するデータを256個加算して、加算結果を2乗して 32ビット計算を行い、最終結果は32ビットの上位16ビットのみ採用して 振幅比較を行っています マイコンでの計算結果 (マイコンで計算したダイヤル7の場合の各周波数の振幅値グラフ) ![]() マイコンでの計算結果とエクセルでの計算結果がほぼ同じ結果となっていますので 期待通りにマイコンソフトが動作していることが確認できました。 これにより、DTMF信号検出の研究開発は完了と致します。 下の写真は今回製作した基板です。 ![]() |
まとめ |
DTMF信号に関しては、生成も、検出もマイコンソフトで実現することが出来ました。 この研究開発結果を何かの装置に採用して頂きフィールドでの実績をつみたいと思っています。 但し、フィールドで使用するためにはもう少し研究開発する余地が残っていると考えています。 それは、今回製作したものは入力信号はDTMF信号と決め打ちしてデータ解析していますが、 例えば音声信号が入力された場合であっても、低群、高群でどれか最大値は必ず存在しますので いずれかのダイヤル番号を検出してしまいます。 これを防ぐためには、最大値と判定するための閾値や、他の周波数成分とある程度の差があることを 判定する閾値等を設定して、DTMF信号ではない事を判定する処理を追加する必要があります。 |
後日談 |
DTMF信号の検出に「正弦波の直交ベクトル分解」を使用したところ
良好な結果がでたため、このことを発見したのは私が最初ではないか、
他の方はこのことに気づいていないのか、などなど考えてしまいました。
そこでこのことを確かめるため、詳細にネットを検索して見たところ
ある数値解析ソフトのライブラリーの説明に以下のような記述を発見しました。 Goertzelアルゴリズムは信号から一つの周波数成分を取り出すDFTの一種。 Goertzelアルゴリズムの特徴は処理量が少ないので処理が高速である。 DTMF信号の検出には高速フーリエ変換 (FFT)アルゴリズムを使用してもできるが DTMF信号の検出にはGoertzelアルゴリズムがよく使用される、 この場合、Goertzelアルゴリズムは FFTアルゴリズムよりも効果的である。 ん~、記述の内容から「正弦波の直交ベクトル分解」は「Goertzelアルゴリズム」 のことを指していると思われます。 「Goertzelアルゴリズム」を検索しても難解な数式しか出てこないので 「Goertzelアルゴリズム」はどのようなものであるかは理解していませんが、おそらく「正弦波の直交ベクトル分解」と 同じものだと推測されます。 |
DTMF信号生成についての研究開発 (2021/02/06) | |
---|---|
概要 | 以前、得意先よりDTMF信号の生成と検出をマイコンソフトで出来ないかとの 問い合わせがありましたので検討してみました。 これらの専用ICは今では入手が困難になってきています。 DTMFが捨てられたものではないのですが、(サポートセンター等で 問い合わせ内容等による分岐でよく使用されているため スマホ等にこの機能はついている。) おそらく、DTMF機能の部分をMainCPUのソフトウエアで実現していると 思われます。 |
研究開発方針 | ネットでいろいろと情報を探してみると予想通り
PWMでDTMF信号を生成しているものがほとんどでした。PWMで生成した場合は
ローパスフィルタをしっかり作りこまないと
PWMのキャリヤ周波数がもれてしまうこともあり、また
他の人がやっている事と同じことを行ってもと思い
PWMは使用せずにマイコン内蔵のD/Aコンバータを使用することにしました。 ・DTMF信号の生成方式:D/Aコンバータ。 ・DTMF信号の振幅の分解能:8ビット ・時間軸の分解能:低群の周波数で1周期 256分割程度、高群の周波数で1周期 128分割程度。 |
基礎情報 | ![]() ・信号周波数偏差:±1.5% 以内 ・信号送出時間:50ms 以上 ・ミニマムポーズ:30ms 以上 ・周期:120ms 以上 「DTMF」2020年10月2日 (金) 02:12 UTC『ウィキペディア日本語版』より |
研究開発内容 | DTMFの周波数に隠された規則性 D/Aコンバータへ出力する16進の値を求めるために、各周波数のサインカーブを エクセルで計算していたところ、高群と低群の周波数の比に規則性があることが判明しました。 高群の周波数を低群の周波数で割った値が下表になります。 ![]() この表から、例えばダイヤル[1],[5],[9],[D]のDTMF信号は同一の形状で、時間軸が伸びているか縮んでいるかの違いだけになります。 この規則性は大変重要でマイコンで三角関数の計算をする事無くコンパクトなテーブルデータだけでDTMF信号を生成することが可能になります。 低群の周波数に対して、高群は低群の 1.28、1.42、1.57、1.73(1.74)、1.92、2.12、2.34倍の周波数の7種類のみであるため 基準となる低群の波形1個と、高群の波形7個のデータをテーブルとしてマイコンに持っていれば 16種類のDTMF信号を生成することが可能となります。また、正弦波のデータは1周期分持つ必要はなく 1/4周期分のデータがあれば、時間軸での折り返しと、振幅の反転により1周期分のデータとなります。 DTMF信号生成のイメージ(ダイヤル7の場合の例) ![]() 上図のように、256分割された低群基準波データと低群基準波の1.42倍(高群)の周波数データを用意し、 低群基準波の1周期が 852Hz になるような時間間隔で、低群と高群のデータを加算した値をD/Aコンバータへ 送ります。これを低群、高群それぞれについて1周期分のデータ送出が終われば最初のデータからの送出を 切れ目無く繰り返すことによりダイヤル7のDTMFが生成されます。 実際は低群と高群ともに8ビットデータで保存してあり、加算すると最大で 9ビットになるためD/Aコンバータに送る前に1/2にしています。 回路図 回路図のダウンロード 回路図は見ての通り、8ビットのD/Aコンバータが内蔵されている PIC16F1709 を使用しています。 入力のインタフェースについては、少し迷いましたが、16個のスイッチ入力とDTMFの生成を1個のマイコンで行えるように 4x4マトリックスとしております。D/A出力の電圧は0V~5Vで、マイコン内のインピーダンスが高いため バッファで受けて電圧調整の可変抵抗を通して再度バッファで受けています、また出力をACにするため コンデンサを挿入してDCをカットしています。クロックは8MHzの水晶発振子を使用し、マイコン内部で 4逓倍して32MHzとしています。(このマイコンの最大クロックで動作させています。) また、正弦波を加算した後では加算前の低群と高群の周波数の測定が困難になるため 低群、高群ともに1周期分のデータを送出する毎にI/Oポートに周波数モニター用のパルスを出力しています。 マイコンのソフト HEXファイルのダウンロード HEXファイルを公開しますので、興味のある方はハードを製作して動作させてみてください。 周波数精度について タイマー時間の設定や、1命令の実行時間(125nsec)から計算上(理論上)の各周波数をソースコードから 算出したものが下表になります。 ![]() 高群の周波数は、各低群の周波数に4種類の係数を掛けたものになるため計算値は4種類あり 低群より精度は少し悪くなりますが、いずれも±1%以下です。 8MHzの水晶発振子がたとえ±0.5%変動したとしても、 周波数偏差の規格値±1.5%を十分に満足しています。 モニタ端子を周波数カウンタで測定したものが下表になります。 ![]() いずれも計算値と非常によく一致しています。 このことからプログラムが意図した通りに動作していることを確認することが出来ました。 これによりDTMF信号生成についての研究開発は完了と致します。 下の写真は製作した基板とダイヤル7の波形です。 ![]() |
まとめ | DTMF信号の生成をマイコンのソフトで実現することが出来ましたので DTMF専用ICが生産中止になってもDTMF信号の生成についてはこれからも対応可能です。 といいますか、現実はその逆で最近の機器はDTMFをマイコンのソフトで実現しているために 専用ICの需要がなくなり生産中止に追い込まれているのだと思います。 次なる課題はDTMF信号の検出をマイコンのソフトで実現することになります。 これには、FFTの知識が必要になると思われます。いままでにFFTを理解しようとして 何度もチャレンジして何度も挫折しましたが、やはり電子回路設計技術者としては FFTは避けては通れないのでしょうね。何回目になるのか分かりませんが再度挑戦してみたいと 思っています。 |