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

回答:
音楽がお好きなら、ぜひ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秒間隔で入力されます。
「.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に示しました。
ご覧のように、LTspice上では、電圧源V1とV2が通常どおりに配置されています。ここで、「CTRL」キーを押しながら各電圧源を右クリックすると、コンポーネントの属性を編集するためのエディタが表示されます(図3)。このエディタにより、export.wavに含まれるデータを各チャンネルに割り当て、そのデータを基に電圧信号を印加することができます。
先述したように、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%が右チャンネル(青色)に現れているということを示しています。
2000年ごろに製造された携帯電話機を使って同じWAVファイルを再生したところ、より良好なセパレーションが得られました(図5)。クロストークは認められませんが、フル・ボリュームで再生すると若干の歪みが生じます。
2018年製の携帯電話機を使って実験を繰り返したところ、最大振幅が1Vの信号を再生してもクロストーク、歪み共にほとんど認められませんでした(図6)。なお、図6では、オシロスコープの感度を500mV/divに設定している点に注意してください。
上では、3種のデバイスと単一のWAVファイルを使って実験を行った結果を示しました。LTspiceで生成したWAVファイルでは、完全なセパレーションが確保されています。しかし、それを再生した結果は、プレーヤのオーディオ品質に大きく依存することがわかります。
音声の暗号化
図7に示した回路は、音声データの基本的な暗号化方法を示したものです。音声データ(オーディオ信号)は、乱数シーケンスを用いて暗号化したり、その後復号化したりすることができます。
voice.wavは、元の音声データを保存したファイルです。一方、random.txtは、ランダムなデータを保存したテキスト・ファイルです(図8)。そのデータは、「Excel」で乱数列を使用することで生成しました。乱数値は、100マイクロ秒ごとに変化させるようにしています。
このファイルを基に、LTspiceのPWL(折れ線波形)電圧源によって、ランダムに変化する電圧V(RAND)を生成します。
暗号化の処理では、まずビヘイビア電圧源B1を用いて音声信号にV(RAND)が加算されます。B1では、更にその結果に対してV(RAND)が乗算されます。得られた結果は、encrypt.wavというファイルに出力されます。encrypt.wavを再生しても、元のオーディオ信号はほとんど認識することができませんでした。
図9に、元の音声データ、暗号化された音声データ、復号化された音声データを再生して得られた信号を示しました。表示には、LTspiceのプロット・ウィンドウを使用しています。
続いて、もう1つのビヘイビア電圧源B2を使用して元のオーディオ信号を復号化しました。得られた結果は、decrypt.wavとして保存しました。
差動電圧源からWAVファイルを生成する
.waveのコマンドでは、構文上、差動電圧信号をデジタル化することはできません。しかし、この問題は図10に示すビヘイビア電圧源を使用することで容易に解決できます。
ビヘイビア電圧源B1は、V(OUT1) - V(OUT2)という電圧を出力します。これであれば、.waveコマンドにおいて通常の方法で使用することができます。
ビヘイビア電圧源では、回路内の任意の電圧/電流を変数として使用し、LTspiceの数学関数を使用して任意の処理を行うことが可能です。得られた結果は、通常の方法でWAVファイルに出力することができます。
LTspiceは強力なシミュレータです。得られた結果を、LTspiceの環境内にとどめておく必要はありません。.waveコマンドを使えば、メディア・プレーヤで再生可能なオーディオ・ファイルをインポート/エクスポート/処理することができます。