前回はアリガチなサンプルデータを「でっち上げ」、Scilab上でデシメーション処理をば行ってみました。できて当然?今回はPythonを使ってソフトウエア無線受信USBドングルRTL-SDRから得た「実データ(Tokyo FM様の瞬間的な音声)」についてScilab上でデシメーション処理してみようと思います。大丈夫か?
※「手習ひデジタル信号処理」投稿順 Indexはこちら
テストデータ
前々回に掲げましたるPythonスクリプト にて、「お求めやすい」ソフトウエア無線受信USBドングルRTL-SDRからテストデータを取得しているところが以下に。
スクリプト内蔵の受信周波数のデフォルト値は、バッチリ Tokyo FM様(いまだにFM東京と言ってしまう私は年寄)の周波数80.0MHzに「チューニング」済です。特に設定しなくとも上記でTokyo FM様の音声1秒強を倍精度複素データ列としてファイルに落とすとともに音声として再生いたします。ほんの一瞬音がなります。音声再生されとりますな。
上記設定では、ファイル出力されるデータは以下の3つとなります。
-
- T0713_audio.csv、音声データファイル、サンプリング周波数Fa=44100Hz
- T0713.csv、ドングルから取得のIQデータファイル、サンプリング周波数Fa*48
- T0713_decimated.csv、上記のIQデータファイルを8:1でデシメーションしたファイル。サンプリング周波数 Fa*6
念のため手順をおさらいすると、
-
- T0713.csvにアンチエイリアス処理をかけてから8:1でダウンサンプリングするとT0713_decimated.csvになる
- T0713_decimated.csvに対してFM復調(アナログ)かけたのち、再びアンチエイリアス処理して6:1のダウンサンプリングすると、サンプリング周波数44100Hzの音声信号(まだIQだけれども)T0713_audio.csvとなる。
- このIQ信号を実数化してスピーカに送れば音声が聞こえる筈。
前回は1のところを、アリガチなでっち上げデータで練習してみたので、今回は実データを処理してみるべしということであります。
まずは処理の準備。過去回で作成済の出来が微妙な自前関数をいくつか使うのでロードしておきます。
exec('genFIRLP2.sci', -1) exec('plotFFT2.sci', -1)
また、サンプリング周波数などはあちこちで参照するので定義しておきます。
Fa = 44100; Fi = Fa * 6; Fs = Fa * 48; Fcutoff = Fs / 8 / 2;
C:¥varディレクトリにおいてあります実データファイルのロードが以下に。
sampleFnam=fullfile("C:\var", "T0713.csv"); sample=csvRead(sampleFnam); dFnam=fullfile("C:\var", "T0713_decimated.csv"); decimated=csvRead(dFnam);
これで元データはsample、Python側ですでに8:1のデシメーション済のデータはdecimatedで参照できるようになりました。
Python側でデシメーション済のデータをFFTかけるコマンドはこんな感じ。
plotFFT2(Fs/8, decimated', 1);
Scilab上でのデシメーション処理
Python側からとってきた元データ ”sample” をScilab側で8:1デシメーション処理を試みたコードが以下に。
coeff100=genFIRLP2(Fs, 100, Fcutoff, 1); af100=filter(coeff100, 1, sample); samplePD8=polyphase_decimation(sample, coeff100, 8); plotFFT2(Fs/8, samplePD8', 1);
デシメーション結果のFFTプロットが以下に。
計算は出来たけど結果はビミョー。肝心の低い周波数帯は「似ている」ような気もするけど、高い周波数帯(どうせ不要になるのだけれど)はちょっと違うような気がしないでもない。使っているLPFが違うのだから当たり前?
この信号処理素人には、はやいとこ音声データにしてみないといいのか悪いのか分からんな。