手習ひデジタル信号処理(96) Scilab、音声データ入出力のための関数類まとめ

Joseph Halfmoon

前回RTLSDR発のIQデータをPythonプログラムからScilabへ輸入。Scilab上でPythonプログラムと同じ処理行い音声データとして再生しました。今回からは逆方向、音声データで変調してRTLSDRから輸入したデータと同等の信号の生成を試みます。まずはScilab上での音声データの処理関数のお勉強から。

※「手習ひデジタル信号処理」投稿順 Indexはこちら

Windows 11のボイスレコーダの件

音声データをつかった変調を試みることになりました。元になる音声データを作らなきゃということで気づいたことが一つあります。大分前の以下の回にて

以下のように書きました。

『しかしそれにしても知らない間に Windowsのサウンドレコーダー廃止になって、ボイスレコーダーに代わっていたのは何だかな~』

今回は上記に対して以下のように書き加えたいと思います。

しかしそれにしても知らない間に Windowsのボイスレコーダーが置き換えられてサウンドレコーダー復活していたのはなんだかな~』

サウンドレコーダーが復活したおかげで、ボイスレコーダーのときに無いと文句を垂れていた「ロスレスのWAVフォーマットのサポート」戻ってきました。良かった。

Scilabの音声関係関数

さてこのScilab素人の老人は、一部の音声入出力関数を使ってはきたものの、その全貌を把握しとりません。そこで今回は音声関係関数の全貌を軽く調べておこうと考えました。拙いダイアグラムが以下に(灰色塗りつぶしの点線内がScilab処理系内の「イメージ」っす。)

ScilabSoundFunctionsDiagram

まず、処理系内でのデータの基本は、

normalized linear sound data

であることです。ノーマライズドのココロは、1点サンプルの数値の最小-1.0 最大 +1.0(上限下限含む)ということです。データそのものは浮動小数(double型)です。サンプルはListまたはMatrix内にサンプリング順に格納されます。複数チャネル(例えばステレオデータでLとRとか)の場合は、Maxtrixの第1次元がチャネルです(Lが先。)

もう一つ内部処理で取り扱える音声データとしてはμ-Law形式の音声形式があります。多分、古のPOTS(若者は知るまい)レベルの音声をISDN(これも若者は知るまい)的デジタルでエンコードするために考案されたフォーマットでないかと。知らんけど。14ビット符合付線形PCMを対数的に8ビットに符号化したものでありんす。Fs=8kHzなので64kbpsなんだと。

ファイル入出力

さてScilabがサポートしている音声ファイルの形式は以下の2種です。

    • .au フォーマット
    • .wav フォーマット

.auは、Unix(Linux)系伝統の音声形式であります。懐かし~Sunマイクロシステムズ起源なんだとか。デフォルトは、μ-lawアルゴリズム符号化であったようです。それでScilabにはμ-lawのサポートがあるのね。しかし.auフォーマットも複数のエンコード形式サポートしているので、8/16/32/64ビットのリニア形式のエンコードで使われることを想定しておるようです(読み込みはリニアな浮動小数点形式でも可らしい記述があります。)

.wavは、MS-DOS以来のPC伝統の音声形式であります。ただしくは RIFF waveform Audio Formatと唱えるらしいです。音声データ用のコンテナフォーマットなので、各種のエンコードデータを載せられるらしいですが、wavといえば、通常、非圧縮リニアPCMです。

なおデフォルトのサンプリングレートは22050Hzです。何も指定しないとこのレートになるので注意が必要です。

さてこの2種のフォーマットのファイルを読み書きするのに関数は6種類もあります。.auの方は読み書き各1種なのですが、.wavの方が読み書き各2種もあるのです。まずは.au形式。

    • auread、.au 形式音声ファイルのロード。代入先を [y, Fs, bits]のようにすることでFs、bits per sampleを読み取り可能。マルチチャンネル可。
    • auwrite、 .au 形式音声ファイルのセーブ。マルチチャンネル可。

次に .wav 形式向け。

    • loadwave
    • wavread
    • savewave
    • wavwrite

ちょっと使ってみた感じでは、loadwaveとwavreadは本質的に同じものじゃないかと思われます。ただし、wavreadの方が与えられるパラメータが多いので細かい制御が可能じゃないかと。
以下はloadwaveを使って、テキトーな.wavファイルをロードしてみたところです。代入先を2つにすると、以下のyの方にファイルの諸元が書き込まれてます。
loadwave
上記のyのリストの中身は以下のようです(一部不明項あり。)

      • 最初の「1」、データのエンコーディングを示す数字。1ならばPCM
      • 2番目の「2」、チャネル数
      • 3番目の「48000」、サンプリング周波数
      • 4番目の「192000」、1秒あたりの平均バイト数
      • 5番目の「4」、ブロックのバイトアライメント
      • 6番目の「16」、1サンプルあたりのビット数
      • 7番目の「0」、不明
      • 8番目の「2」、1サンプルあたりのバイト数?
      • 9番目の「209280」、データ長

同じファイルをwavreadしてみたのが以下です。
wavread

音声形式の変換

「正規化リニア」形式とμ-Law形式感の変換関数として以下2つがあります。muと書かれているのがμ-Law形式側です。

    • lin2mu
    • mu2lin

なおmu側は8ビットです。

音声再生

音声再生には2つの関数が用意されていますが、playsndの方が本体で、sound関数の方はラッパらしいです。playsndは変数に格納されている音声データだけでなく、ファイルに格納されている音声データを直接再生することもできるようです。

    • playsnd
    • sound
音声信号の生成サポート

サンプリング周期の時間ベクトルを生成してくれる関数が用意されています。

    • soundsec

これを使うと指定した秒数分の長さのサンプリング周波数のベクトルを生成してくれます。結果を t として、これを sin(2*%pi*SND*t) のようにすればSND[Hz]の単音のベクトルが得られる筈。試して無いケド。

音声信号のグラプ表示

以下の2種の関数があるようです。これも試すのは次回かね。

    • analyze、 音声信号の周波数プロット
    • mapsound、音声信号のスペクトログラム表示

だいたい分かった。ホントか?

手習ひデジタル信号処理(95) Scilab、Tokyo FMの再生、1秒ちょっと へ戻る

手習ひデジタル信号処理(97) Scilab、音声データの入力と解析プロット へ進む