LTspiceでWAVファイルを活用する―ステレオ音声データの再生/生成/暗号化

質問:

LTspice上でオーディオ用のWAVファイルを使用したいと考えています。ステレオ・データを再生/生成したり、ボイス・メッセージを暗号化したりすることはできますか?

RAQ Issue: 175

回答:

音楽がお好きなら、ぜひLTspice®でWAVファイルを利用してシミュレーションを実行してみてください。

本稿では、LTspice上でWAVファイルを活用する方法を紹介します。特に、ステレオ(またはより多くのチャンネル)に対応するオーディオ・データの扱い方について詳しく解説します。

LTspiceでは、回路シミュレーションの出力結果としてWAVファイルを生成したり、回路シミュレーション用の入力データとしてWAVファイルをインポートしたりすることができます。モノラルのデータについては、LTspice上でWAVファイルを入力として使用したり、LTspiceの出力を基にWAVファイルを生成したりする方法を詳しく説明したドキュメントやビデオが公開されています。本稿では、ステレオ(またはより多くのチャンネル)用のWAVファイルをLTspice上で使用する方法について詳しく説明します。

LTspiceは数多くの機能を備えています。それらのなかでも、オーディオ・データの処理機能は優れたものだと言うことができます。コンピュータの画面上で回路の実際の動作を確認できるのは魅力的なことです。それに加え、LTspice以外でも再生可能なオーディオ・データを生成できるなら、実際の聴感をシミュレーションによって評価できることになります。以下では、ステレオ・データを保存したWAVファイルをLTspiceにエクスポート/インポートする方法を示します。また、WAVファイルを更に活用できるようにするためのヒントや使い方のコツも紹介します。

ステレオ対応のWAVファイルの生成

まず、モノラル信号を基にWAVフォーマットのステレオ・データを作成する方法を説明します。図1に示したのは、振幅が1V、周波数が1kHzのサイン波を生成し、2つのチャンネルCH1、CH2に対して交互に信号を入力する回路です。各チャンネルには、1kHzのトーン信号が2秒間隔で入力されます。

図1. シミュレーション用の回路。各チャンネルに対し、1kHzのトーン信号が2秒間隔で入力されます。2つのチャンネルで生成された2つの信号はWAVファイルとして保存されます。
図1. シミュレーション用の回路。各チャンネルに対し、1kHzのトーン信号が2秒間隔で入力されます。2つのチャンネルで生成された2つの信号はWAVファイルとして保存されます。

「.wave "C:\export.wav" 16 44.1k V(CH1) V(CH2)」というコマンドは、16ビットの分解能、44.1kSPSのサンプリング・レートで各チャンネルの信号をデジタル化し、生成されたオーディオ・データを「C:\export.wav」として保存するという意味です。WAVファイル内では、このコマンドでサンプリング・レートの次に指定している各信号が各チャンネルのデータとして扱われます。LTspiceでは、1つのWAVファイル内に最大6万5535チャンネルのデータを保存できます。チャンネル数の拡張に必要な作業は、上記のコマンドに信号名を追加するだけです。

LTspiceの.waveコマンドは、デフォルトでは1つ目に指定した信号をオーディオ・チャンネルの左側のデータとして保存し、2つ目に指定した信号を右側のデータとして保存します。上記の例の場合、export.wavをメディア・プレーヤで再生すると、回路上のノード名とは関係なく、CH1のデータが左側チャンネルのデータとして、CH2のデータが右チャンネルのデータとして読み出されます。デフォルトでは、CH1とCH2のデータはそれぞれ.wavファイル内に「chan 0」、「chan 1」のデータとして保存されます。このルールは、以下で説明するデータの読み出し方法において重要な意味を持ちます。

シミュレーションを実行すると、export.wavがエクスポートされます。このファイルに含まれる2つのチャンネルのデータは、別の回路が備える2つのチャンネルに入力する信号として使用することができます。ここで言う別の回路の例を図2に示しました。

図2. 独立した2つのチャンネルを備える回路。export.wavに含まれる右側/左側のデータがそれぞれのチャンネルに入力されます。
図2. 独立した2つのチャンネルを備える回路。export.wavに含まれる右側/左側のデータがそれぞれのチャンネルに入力されます。

ご覧のように、LTspice上では、電圧源V1とV2が通常どおりに配置されています。ここで、「CTRL」キーを押しながら各電圧源を右クリックすると、コンポーネントの属性を編集するためのエディタが表示されます(図3)。このエディタにより、export.wavに含まれるデータを各チャンネルに割り当て、そのデータを基に電圧信号を印加することができます。

図3. 図2の回路の電圧源V1の設定。export.wavのステレオ・データを入力信号の印加に使用します。V1への入力はexport.wavのchan 0のデータを基に生成するよう設定しています。
図3. 図2の回路の電圧源V1の設定。export.wavのステレオ・データを入力信号の印加に使用します。V1への入力はexport.wavのchan 0のデータを基に生成するよう設定しています。

先述したように、LTspiceでWAVファイルを生成し、信号をデジタル化して保存する際には、6万5535個ものチャンネルを設定することができます。必要な作業は、所望の数のチャンネルを.waveコマンドの末尾に追加するだけです。デフォルトでは、最初のチャンネルにchan 0という名前が付けられ、次のチャンネルにはchan 1という名前が付加されます。以下、チャンネルの数に応じて同様の処理が繰り返し行われます。本稿の例の場合、図1のシミュレーションで生成したexport.wavでは、電圧V(CH1)のデータがchan 0のデータで、V(CH2)のデータがchan 1のデータとして保存されます。電圧源を使用して各チャンネルの信号を生成するには、電圧源の値の行に、使用する.wavファイル名とチャンネルの番号を指定します。例えば、以下のような具合です。

  • 図1のV(CH1) のデータを再生するように V1 を設定する:wavefile="C:\export.wav" chan=0
  • 図1のV(CH2) のデータを再生するように V2 を設定する:wavefile="C:\export.wav" chan=1

オーディオ信号のチャンネル・セパレーション

メディア・プレーヤでexport.wavを再生すると、まず1kHzのトーンが左のスピーカ(またはヘッドフォン)で2秒間再生され、続いて右のスピーカで2秒間再生されるはずです。しかし、実際には、完全なチャンネル・セパレーションが確保されていないかもしれません。これは、メディア・プレーヤを実行するハードウェアの品質に依存します。

図4に示したのは、ノート型PC上でexport.wavのデータを再生し、得られた信号をオシロスコープで観測した結果です。これは左チャンネル(黄色)の信号の約30%が右チャンネル(青色)に現れているということを示しています。

図4. ノート型PCでexport.wavのデータを再生した結果。左チャンネル(黄色)から右チャンネル(青色)に約30%のフィードスルーが生じていることがわかります。
図4. ノート型PCでexport.wavのデータを再生した結果。左チャンネル(黄色)から右チャンネル(青色)に約30%のフィードスルーが生じていることがわかります。

2000年ごろに製造された携帯電話機を使って同じWAVファイルを再生したところ、より良好なセパレーションが得られました(図5)。クロストークは認められませんが、フル・ボリュームで再生すると若干の歪みが生じます。

図5. 2000年ごろに製造された携帯電話機によってexport.wavのデータを再生した結果。クロストークは認められませんが、フル・ボリュームで再生すると歪みが生じます。
図5. 2000年ごろに製造された携帯電話機によってexport.wavのデータを再生した結果。クロストークは認められませんが、フル・ボリュームで再生すると歪みが生じます。

2018年製の携帯電話機を使って実験を繰り返したところ、最大振幅が1Vの信号を再生してもクロストーク、歪み共にほとんど認められませんでした(図6)。なお、図6では、オシロスコープの感度を500mV/divに設定している点に注意してください。

図6. 2018年製の携帯電話機によってexport.wavのデータを再生した結果。振幅、クロストーク、歪みのいずれについても、非常に優れた性能が得られることがわかります。
図6. 2018年製の携帯電話機によってexport.wavのデータを再生した結果。振幅、クロストーク、歪みのいずれについても、非常に優れた性能が得られることがわかります。

上では、3種のデバイスと単一のWAVファイルを使って実験を行った結果を示しました。LTspiceで生成したWAVファイルでは、完全なセパレーションが確保されています。しかし、それを再生した結果は、プレーヤのオーディオ品質に大きく依存することがわかります。

音声の暗号化

図7に示した回路は、音声データの基本的な暗号化方法を示したものです。音声データ(オーディオ信号)は、乱数シーケンスを用いて暗号化したり、その後復号化したりすることができます。

図7. 音声データの暗号化方法。電圧源によりランダムな信号を生成し、得られたデータを暗号化/復号化する例を示しています。
図7. 音声データの暗号化方法。電圧源によりランダムな信号を生成し、得られたデータを暗号化/復号化する例を示しています。

voice.wavは、元の音声データを保存したファイルです。一方、random.txtは、ランダムなデータを保存したテキスト・ファイルです(図8)。そのデータは、「Excel」で乱数列を使用することで生成しました。乱数値は、100マイクロ秒ごとに変化させるようにしています。

図8. random.txtに保存したデータ。このデータはExcelを用いて生成しました。
図8. random.txtに保存したデータ。このデータはExcelを用いて生成しました。

このファイルを基に、LTspiceのPWL(折れ線波形)電圧源によって、ランダムに変化する電圧V(RAND)を生成します。

暗号化の処理では、まずビヘイビア電圧源B1を用いて音声信号にV(RAND)が加算されます。B1では、更にその結果に対してV(RAND)が乗算されます。得られた結果は、encrypt.wavというファイルに出力されます。encrypt.wavを再生しても、元のオーディオ信号はほとんど認識することができませんでした。

図9に、元の音声データ、暗号化された音声データ、復号化された音声データを再生して得られた信号を示しました。表示には、LTspiceのプロット・ウィンドウを使用しています。

図9. 各音声データに対応する信号。元の音声データ、暗号化した音声データ、復号化した音声データの再生結果をプロットしています。
図9. 各音声データに対応する信号。元の音声データ、暗号化した音声データ、復号化した音声データの再生結果をプロットしています。

続いて、もう1つのビヘイビア電圧源B2を使用して元のオーディオ信号を復号化しました。得られた結果は、decrypt.wavとして保存しました。

差動電圧源からWAVファイルを生成する

.waveのコマンドでは、構文上、差動電圧信号をデジタル化することはできません。しかし、この問題は図10に示すビヘイビア電圧源を使用することで容易に解決できます。

図10. 差動電圧信号からWAVファイルを生成するための回路
図10. 差動電圧信号からWAVファイルを生成するための回路

ビヘイビア電圧源B1は、V(OUT1) - V(OUT2)という電圧を出力します。これであれば、.waveコマンドにおいて通常の方法で使用することができます。

ビヘイビア電圧源では、回路内の任意の電圧/電流を変数として使用し、LTspiceの数学関数を使用して任意の処理を行うことが可能です。得られた結果は、通常の方法でWAVファイルに出力することができます。

LTspiceは強力なシミュレータです。得られた結果を、LTspiceの環境内にとどめておく必要はありません。.waveコマンドを使えば、メディア・プレーヤで再生可能なオーディオ・ファイルをインポート/エクスポート/処理することができます。

Simon Bramble

Simon Bramble

Simon Brambleは、アナログ・デバイセズのシニア・フィールド・アプリケーション・エンジニアです。Linear Technology(現在はアナログ・デバイセズに統合)に在籍しているときから、アナログ回路を担当していました。ロンドンのブルネル大学でアナログ技術と電源技術を専攻し、1991年に電気工学と電子工学の学位を取得しています。