since 2007.8 by K-ichi


回路図
以前、LFSR出力にFFTをかけてみたことがあった。見たことのない、もこもことした結果が出た。
その回路を流用して、再び実験してみた。

赤で囲った部分は、今回追加した回路。
無くても動作はするが、おまじないということで、PIC(12F675)にパスコンを付け、野放しだったMCLRピンをプルアップしておいた。また、内部4MHzでは処理が間に合わないので、外から20MHzを供給することにした。


回路外観
HCU04を使ったオシレータ(でっかい赤の囲み部分)は、セラロックのアプリケーションマニュアル(PDF)にあるそのままの回路。openとある抵抗は実装してない。

基板は2階建てで、オシレータは2階の部分。白黒線は、外部から5Vを供給している。
RCAコネクタの先は、PCのライン入力に直接つながっている。


前回実験のあと、何か助けにならないかと、易しそうな解説書「フーリエの冒険」をあたったり、表計算で実際に計算してみたり、いろいろやってはみた。……が、身にはならず。基礎がダメでは家は建たないことを痛く実感。

痛い痛い言ってるだけではつまらないので、とりあえず前回の7bit LFSRの波形を、もう一度見てみることにした。WaveSpectraの設定は、デフォルトからWave表示倍率を変更したのみ。ここで、FFTサンプル数とサンプリング周波数を、何通りかに変えて試す。

前回と同じ44.1kHz、16384点FFTでは、同様の140Hzの重なったモコモコが見える。前回はフィボナッチ型、今回はガロア型(Wikipedia)だが、変わった様子はない。
FFTのサンプル数を減らしたり、サンプリング周波数を上げたりすると、モコモコが荒くなる。波由来ではなく、処理由来の模様のような気がする。縦にサンプリング周波数、横にFFTサンプル数を取って並べると、右上と左下同士が酷似している。

ちなみにヘルプによれば、サンプリング周波数とFFT点数によって、周波数の分解能が決まるという。44.1kHzサンプリングで16384点では、16384/44100≒2.7(Hz)と計算できる。


16384点FFT、88.2kHzサンプリング


8192点FFT、44.1kHzサンプリング

16384点FFT、44.1kHzサンプリング

32768点FFT、44.1kHzサンプリング


16384点FFT、22.05kHzサンプリング

LFSR出力は、駆動周波数の整数倍にスペクトルの谷がある。駆動周波数のおおむね1/2以下では、周期を持つもののホワイトノイズ的な出力が得られる。駆動周波数の3/2、5/2、7/2……には丸いピークをもち、それらピークは-20dB/dec.で減衰する。


サイン波を、特定倍の周波数で特定倍して加算すると、いろんな波形ができる。たとえば奇数倍波を-20dB/dec.で弱めながら、波を揃えて加算すると矩形波になる。
いろんなLFSRを合成したら何か出てくるかも? と、あれこれ組み合わせを試してみた。

作成するLFSRは、100Hzの整数倍で1kHzまで。同時駆動なので、位相は揃っている。
PICの性能の制約から、700Hzが706Hz、900Hzが923Hzにずれているが仕方ない。

組み合わせるLFSRの組は、100Hzを基本とし、n倍波、(2n-1)倍波、2(n-1)倍波、とする(n=1,2,3,...,10)。
合成は、各波に係数を掛けて重み付けをして加算する。また、とりうる最大値が、出力の最大値になるように調整する。重み付けは、各波を1/1倍、1/√n倍、1/n倍、1/n2倍する。1/n0倍、1/n0.5倍、1/n1倍、1/n2倍、と言い換えることもできる。
重み付けの、1/√n倍は-3dB/oct.(-10dB/dec.)で、ピンクノイズもしくは1/fノイズ、1/n倍は-6dB/oct.(-20dB/dec.)で、レッドノイズもしくはブラウンノイズ、の減衰量に相当する。

1/1倍1/√n倍1/n倍1/n2
n=
1,2
 

n=
1,3
 

n=
1~10
 

n=
1,3,5,7,9
 

n=
1,2,4,8
 

n=
1,2,4,8
追試:位相ずらし
 

1/1倍1/√n倍1/n倍1/n2


波形表示を見ると、ちゃんと思惑通りの計算波形になっているのが確認できる。

スペクトラムの方は、何がなんだか解らない小汚いものが出ている。
2(n-1)波の組み合わせは、各波の減衰域の谷が合う所があるためか、多少きれいに見える。追試で、初期のカウント値を変えて位相をずらしてみたところ、他と変わらなくなった。それも含めてざっくり見れば、混ぜ込んだうちの最高周波数のLFSRの波形を、信号の無い部分を減らしつつノイジーに荒らした、そんな感じ。最高周波数の周波数以下はホワイトノイズ、それ以上は-20dB/dec.、で括れそう。

平坦な低周波側はともかく、減衰域やその切り替わりあたりに、「加算係数にかかわる何か」が見えそうな期待を持っていたが、それっぽい変化は見出せず。理由は解らない。

これらの出力(追試分除く)を、2.73秒ごとに切り替えて、映像に撮ってみた。
100Hz LFSRが「ブンガーブンガー」言ったり、1kHz LFSRが機関銃のようだったりするのは、LFSRが7bitしかなく周期が聞こえてしまっているため。100Hz LFSRなら、約1.3秒ごとの繰り返しに聞こえる。
波をたくさん混ぜれば、普通のノイズに聞こえる。2(n-1)組だけは、音が少し変わっている。減衰域が揃って特徴的なせいかと思ったが、「位相ずらし」をしても、音の雰囲気は変わらなかった。




プログラムは、正確を期すため、クロックを勘定している。タイマー割り込み等、ペリフェラルは一切使っていない。

LFSRは、100Hzから整数倍で1kHzまでの10本。これらを回すには、全てのLFSRの最小公倍数の周波数が必要で、駆動サイクルはさらに倍になる。12F675を最高速の20MHzで走らせても、504kHzは到底無理なので、24kHzで回している。そのため先の記述のとおり、700Hzが706Hz、900Hzが923Hzとズレている。
LFSRのシードは全て「1」で、同時に駆動するので位相は揃っている。

開発は、純正のMPLAB IDEを使い、PICkit3(日本語版ユーザマニュアルPDF)で書き込んだ。
MPLABは、日本語ページにあるver8.60ではなく、最新版の8.89の方を使っている。
ライタは、以前はRCDライタを使っていたが、PC更新とともにシリアル環境が無くなったため、購入にいたった。

PIC12F675/12F629用、アセンブラソース+HEXファイル

波形の取り込みは、WaveSpectraを使う。WS.INIを書き換え、ウインドウを800×600に設定。WaveSpectraが録音している状態を、映像および画像として取り込む。
映像は、カハマルカの瞳で録画する。800×600ピクセル24bitで30fpsギリギリなので、これで無圧縮録画する。2GBが3ファイルほどできるので、AviUtlの拡張編集に取り込み、文字入れやカット編集などをする。YouTubeのHD扱いの制約があるので、横幅を1280ピクセルに水増しする。AviUtlのMPEG4出力は、デフォルトの128kbpsでは音質が劣悪なので、最高音質の512kbpsに変更する。出力された50MB弱のMPEG4ファイルを、YouTubeに上げる。
画像は、KoClipを使う。クリップボードを監視し、画像を見つけると自動的に画像ファイル化してくれるツール。次々に変化する現象を、PrintScreenを押すだけで連続して画像ファイルとして保存できる。

使ったツール類は以下のとおり。
いずれも、Win7 Pro 64bitで使用できた。

種別ツール名バージョンWebページ
PIC開発環境MPLAB IDE8.89Microchip technology(Japan)
回路図エディタBSch3V0.69.05水魚堂
ペイントmspaint.exe-Win7に包含
スペクトラムアナライザWaveSpectra1.51efu
デスクトップの録画カハマルカの瞳3.4Club Mil Besos
デスクトップのコピークリップボードの画像自動保存ソフト KoClip1.4.8Vector
映像編集AviUtl0.99mAviUtlのお部屋

0 件のコメント:

コメントを投稿

.

関連記事


この記事へのリンク by 関連記事、被リンク記事をリストアップする」記事

ブログ アーカイブ