電話でのお問い合わせ0120-439-296

第2回 スピーカ周波数特性テスタの実装

著者:山田浩之(Y-Logic)  企画・編集:ZEPエンジニアリング

本シリーズでは、STマイクロエレクトロニクスのオールインArmマイコン・キット“STM32H747I-DISCO”(Cortex M4/M7/DSP搭載、LCD、動作クロック480MHz、マイク入力ほか)の LCDとオーディオ機能を使って、役に立つものを作っていきます。第2回は、GUIでスピーカの周波数特性を測定するプログラムを実装し、スピーカ周波数特性テスタを作ります。プログラムはディジタル・マイクとオーディオCODECを使った第1回のプロジェクトをベースに作成します。

図1 この連載では、オールインArmマイコン・キット“STM32H747I-DISCO”を
使ってオーディオ・アナライザを制作中

■ スピーカの特性を知りたい

皆さんは持っているスピーカの特性をどのくらい把握しているでしょうか?例えば、私の手元にあるスピーカの説明書を見ると、主な仕様にスピーカ特性として「出力、周波数帯域、インピーダンス」が掲載されています。これだけでは低音から高音までフラットに出るかどうかや出力がひずまないかを判断することができません。スピーカの評価に必要な特性としては、周波数特性、ひずみ特性、指向性、位相特性などが挙げられます。

本稿では、周波数特性と歪み特性をテストする機能を実装します。結果は、パワー・スペクトルで表示します。ほかのスピーカのテスト結果と比較することで、スピーカ出力がどの周波数にピークをもつか、信号が忠実に出力されているかを判断することができるでしょう。

■ コーディング

● GUIのデザイン

TouchGFXから第1回で作成したプロジェクト・ファイルの“CM7\TouchGFX\TouchGFX_AudioPlayRec. touchgfx” を開いてGUIをデザインします。実装する機能はパワー・スペクトルの表示、任意周波数のトーン(sin信号)の出力です。
2つのボタンを用意して[Tone Play/Stop]を押すと任意周波数の出力モード、[Run]を押すとトーンの周波数をスイープさせて全周波数範囲の特性取得するモードで動作させます。
図2 のように“Widget”を配置します。パラメータは図3 のように設定しました。
グラフ表示を実現するための“graph1”にスペクトルを表示するので、表示範囲を適切に設定して、縦軸がdB、横軸が周波数となるよう、グリッド線表示とラベル表示を有効にして、ラベル・テキストを編集します(目盛りと凡例を表示にする)。UIの色や見た目は好みに応じて調整しています。

図2 DesignerでWidgetを適当な位置に配置

図3 各Widgetの設定値

● コールバックの追加

UIコンポーネントを操作したときに関数が呼ばれるように、[Interactions]にコールバック関数を追加します(図4)。

図4 イベントで関数が呼ばれるようにInteractionを追加

[Trigger]に発生条件を、[Action]に[Call new virtual function]を指定すると、GUIビューの基底クラスに、[Function Name]に指定した関数が追加され、イベント発生時にその関数が呼ばれるようになります。ユーザ処理はその継承クラスに実装します。
スペクトル描画を定期的に更新するための[Interaction]も追加します。[Trigger]に[Trigger on every N tick]を指定することで、任意の間隔で関数が実行されるようになります。
最後に[Generate Code]ボタンを押してコードを生成します。

● TouchGFXのバージョンアップに注意

本シリーズ 第1回で公開したプロジェクトは、TouchGFX Designerのバージョン“4.23.2”で作成しました(2024年12月4日)。
現在のバージョンは“4.24.2”です。古いバージョンで作成したプロジェクトを“4.24”を使って再度、Generateする場合、生成コードのバージョン齟齬が発生します。ソースコードは TouchGFX Designer と STM32CubeMX の両方によってGenerate されますが、STM32CubeMX のプラグインとして TouchGFX が組み込まれているので、Designer のバージョンと CubeMX の TouchGFX のバージョンを合わせる必要があります。具体的には、CubeMX 上で TouchGFX プラグインをアップデートして、.ioc ファイルを開き、Generate することでプロジェクト中のソースコードが更新されます。
TouchGFX 4.24.2は、本稿の執筆時点(2025年1月8日)で、CubeMX側に存在しないので、私の環境では“4.24.0”を使用しました。開発途中でツールのアップデートを行うとトラブルに苦労することが多いので、ユーザ目線でいうと少し困りものです。

● CMSIS-DSPのリンク

STM32を始めとするCortexマイコンの場合、FFTなどの信号処理のコーディングは、CMSIS-DSPライブラリを利用するのが効率がよいです。
STマイクロエレクトロニクスのウェブサイト How to integrate CMSIS-DSP libraries on a STM32 projectの説明にしたがって、プロジェクトにCMSIS-DSPライブラリを追加します(図5)。

図5 プロジェクトにCMSIS-DSPライブラリを追加する方法の
説明があるウェブサイト How to integrate CMSIS-DSP libraries on a STM32 project

プロジェクト(CM7側)の設定は、下記3点を行います。

  • ライブラリ・ファイル
    [Properties]-[C/C++ Build]-[Settings]-[MCU G++ Linker]-[Libraries]-[Libraries (-l)]
    arm_cortexM7lfsp_math を追加
  • ライブラリのパス
    [Properties]-[C/C++ Build]-[Settings]-[MCU G++ Linker」-[Libraries]-[Library search path (-L)]
    ../../../Drivers/CMSIS/DSP/Lib/GCC を追加
  • ヘッダのパス
    [Properties]-[C/C++ Build]-[Settings]-[MCU G++ Complier]-[Include paths]-[Include paths (-l)]
    ../../../Drivers/CMSIS/DSP/Include を追加

● 処理の実装

先ほど追加したコールバック関数を継承クラス(Screen1View.cpp)にオーバライドして、必要な処理を実装していきます。
録音、再生部分は、本シリーズ 第1回で作成し公開した“codec\_routine.c”の関数を利用します。実装した処理を図6 に示しました。

図6 実装したプログラムの処理

処理は定期処理の“OnTick”関数で実装しています。窓関数にはスペクトル漏れの小さいBlackman窓を使用しました。
作成したプログラムは簡易的なもので、測定できるのはあくまで定性的な特性です。ちゃんとした特性を測定する場合、性能のわかっている測定器を使用するべきことは付記しておきます。

■ 完成したスピーカ・サウンド・テスタを使ってみる

● ひずみの測定

適当な周波数のトーン出力で、波形のひずみを確認します。
STM32H747I-DISCOに実装されているCODEC IC WM8994(図7)とディジタル・マイク MP34DT01-M(図8)の組み合わせで、60dB以上のS/Nが得られました。

図7 STM32H747I-DISCOに実装されているCODEC IC WM8994の内部ブロック図

図8 STM32H747I-DISCOに実装されているディジタル・マイク MP34DT01-Mのデータシート

図9 に、2つのスピーカのパワー・スペクトルの違いを示しました。少しコードを変えれば、相互変調ひずみも確認できるでしょう。

図9 スピーカによるひずみ特性の違い

● 周波数特性の測定

トーン信号の“Sweep”により全周波数範囲の特性を確認します。[Run]を押すと、Sweep出力が開始し、スペクトルはピーク・ホールドで表示されます。
図10に実際のスピーカの周波数特性の実測値を示します。

図10 実際のスピーカの周波数特性を実測

今回のプログラムのように周波数をゆっくり Sweepしていくと、ある周波数から聞こえなくなります。スピーカから音が出ていて、スペクトルが確かに表示されているのに、自分の耳には聞こえないわけです。
余談ですが、私は13kHz以上の周波数が聞こえなくなっていて戦慄しました。音を知覚する蝸牛の有毛細胞は再生しませんから、二度と聞こえるようにはなりません。私にハイレゾは不要、32kspsで十分のようです。

● マイク-測定器の距離と定在波の影響

図10 では、スペクトルに極や零点のように見える箇所があります。原因は、スピーカとマイクの距離です。この距離を変えるとどうなるでしょうか。
ピークの周波数が距離に依存するものがあります。これには定在波の影響が考えられます。
3kHzの音波の波長$\lambda$は、約10cm($=3 \times 10^2$m/s/$3 \times 10^3$Hz)です。スピーカとマイクの距離が数cm~数十cmであれば、その距離が波長と等しくなるになる周波数を結果に含むことになります。
定在波の影響を減らす方法は次のとおりです。

  • 波長より十分遠い位置で測定(遠距離音場)する
  • 無響室で測定する
  • スイープではなくインパルス応答のFFTで測定する

■ プログラムの改良

● ログ・スケール表示は工夫が必要

通常、スピーカ特性のスペクトルの周波数軸はログ・スケールで表示しますが、本器のパワー・スペクトルの周波数はリニア・スケールです。残念ながら、今のところ TouchGFXの graph Widgetは、リニア・スケールにしか対応していません。
1つの対処法は、ユーザ側で“linear-log”変換を行うことです。TouchGFX 上のユーザ・ラベルを“10^<>Hz”とすれば、図11のような「疑似ログスケール表示」が可能です。ただし、対数目盛り線を表示する機能はないので、目盛り線を入れるためにはWidgetのソースコードに手を入れるしか方法がありません。
ほかの方法として、TouchGFX 組み込みのWidgetを使うのではなく、ユーザがビットマップに直接描画してログ・スケールのグラフを表示する方法があります。

図11 ユーザ・ラベルを工夫すれば対数軸表示も可能

■ 次回予告:オーディオ・スペクトログラムの製作

次回は、ビットマップの直接描画によりスペクトログラムを表示するWidgetを作成して、超音波やインダクタ鳴きなどの「人には聞こえない音を目で見る」機能を実装したいと思います。

参考文献
[1] ] [VOD/KIT/data]Arm M4/M7/DSP×500MHz!STM32H7ハイスペック計測通信Module開発、ZEPエンジニアリング株式会社。
[2] タッチパネルLCD搭載!Cortex-M4/M7×500MHz!全部入りマイコン・キット STM32H747I-DISCO誕生、ZEPエンジニアリング株式会社。
[3] 高感度受信!ソフトウェア無線機の心臓部 “Root-Raised Cosine Filter”の設計、ZEP エンジニアリング株式会社。
[4] ソフトウェア無線と通信の同期、ZEP エンジニアリング株式会社。
[5] ディジタル信号処理入門 FFTスペアナの制作、ZEP エンジニアリング株式会社。
[6] ディジタル信号処理入門 再生速度&音程エフェクタの制作、ZEP エンジニアリング株式会社。