投稿

4月, 2011の投稿を表示しています

Ogg Vorbis と ACC, MP3 位相比較

イメージ
YouTubeがようやく完全WebMになったので、改めて音声コーデックについて考えてみようと思う。WebMは音声にVorbisというコーデックを使っている。従来はAAC だったので、その違いはあるのだろうか。特にYouTubeでは解像度の低い動画をアップすると、低ビットレートでコーデックされたので音質は著しく劣化した。ビットレートは不明だったが、音質とデータ容量から60kbpsもしくはそれ以下と思われる。ここでは57kbpsを基準にしてVorbis、AAC、MP3を比較しようと思う。 http://www.vorbis.com/ Ogg Vorbisについて簡単に紹介 対応フォーマットなどでOggと書いてある場合 Ogg Vorbisを指している場合が多い。本来Oggはコンテナで、Vorbisは音声フォーマット。OggコンテナにはFlacなど他の音声フォーマットが入る場合もある。そうなるとOgg = Ogg Vorbisでは混乱を招き兼ねない。ということで好ましい言い方ではないと思うのだが、すでにこの言い方が普通になってしまっているので慣れるしかないようだ。 ライセンスについて。MP3, AAC, Ogg Vorbisの中で、オープンソース&パブリックドメインはOgg Vorbisだけ。他はライセンスが発生するので、使用する場合は料金を払う必要がある。ユーザーとして利用するだけなら無料であるが、メーカーなどはライセンス料を支払っている。この関係でオープンソフトウェアはMP3,AACを手軽に扱うことは出来ない。Audacityにしても、MP3,AACは別途組み込む必要がある。Chromiumに至ってはmp3,AACをaudioタグで再生することすらできない。 Ogg Vorbisは普及しているのか? メモリオーディオなどのハードはMP3のサポートは当然だが、Ogg Vorbisをサポートしている機種は数えるほどしかない。そういう意味ではハード寄りの普及はメーカーの姿勢が変わらない限り見込めない。 一方ウェブ上ではこれから徐々に普及していくと思われる。知らず知らずの間に使われるようになるのではないかな? やはりライセンスの問題が発生しないというのは強いと思う。このBlogでも音声はOgg Vorbisを使っている。 Ogg V

FIR LPF及びHPFの係数を求めるプログラム

イメージ
前回のFIR LPF(ローパスフィルタ)に加えて、HPF(ハイパスフィルタ)にも対応させてみた。ちゃんとした資料もない中、適当に作っているので問題があるかもしれない。LPFの改造でHPFは実現できるので手軽に作れるかなと思ったら甘かった。少々苦労したが、まぁ結果はそれなりに出たかな。 LPFはタップ数が少ない方向で作れるが、HPFはサンプリング周波数に応じてかなりのタップ数を要求してくる。タップ数が少ないと全くHPFにならないこともあるので注意。またタップ数が増えるとデジタルフィルタの高速化を検討しないとだめだと思った。 FIR LPF/HPF Low-Pass Filter High-Pass Filter Tap N (odd number) Sampling Frequency Hz Cutoff Frequency Hz Rectangular Window Hamming Window Hanning Window Coefficient n Audacityで周波数スペクトル表示 タップ数による違いがどうでるか確認してみた。 ホワイトノイズにHPFをかけてみた。 サンプリング周波数は44100Hz。 150Hz以下をカット。 201タップ 501タップ 1001タップ 201タップでは効きが弱くHPFとしては不十分。501タップはそれなりの効き方をしている。さすがに1001タップもあると理想的な形になってくる。まじめに処理するとなると1000タップ以上は欲しくなる。 さらに低いカットオフ周波数で多めのタップ数で試す HPF カットオフ周波数80Hz 8001タップ これだけのタップを使うとかなりの精度になることが分かった。でも処理に時間がかかるので、デジタルフィルタの効率化をしないとダメだわ。 スクリプト 110727 今までHTMLソースを見れば分かると思って記載しなかったのだけど、そうでもないようなので改めて置いておきます。下記をコピーしてhtmlファイルにして、ブラウザで実行

FIRの係数を求めるプログラム Javascript

イメージ
勉強がてらにデジタルフィルタの係数を求めるプログラムをJavaScriptで作ってみた。信号処理の基本的なローパスフィルタになる。フーリエ級数の単純打ち切り法で得た係数に対して、打ち切りの影響を最小限にするためにハミング窓関数をかけている。直線位相特性を持つデジタルフィルタなのでタップ数は奇数。サンプリング周波数とカットオフ周波数を入力すると、カットオフ周波数よりも上の周波数が滑らかに削られるフィルターになる。位相が乱れない優れたフィルタ。数式はこんな感じで、これを元にプログラムを作ってみた。 FIRの係数を求める式。 n はタップのn 0 , n 1 , n 2 ・・・のこと。ωはカットオフ周波数。 0~π の範囲で設定する。周波数(サンプリング周波数の1/2)の半分なら π/2 。 1/3 であれば π/3 という具合。 下がハミング窓関数を求める式。 -M < n < M M は (N-1)/2 で求めている。この N はタップ総数。 21タップであれば、 M = (21-1)/2 = 10 となる。 これをもとに素直にプログラムにしてみるが、苦労したのはテキストエリアに配列の数値を改行しながら出力する部分だったりした。テキストエリアはマウスでぐぐぐっと広げられるのね。おおっすげ~と思った。作ってからJavaAppletで作ったほうが早かったとも思ったが、まぁJavaScriptの勉強なのでよしとする。 最終的には音の加工を目的にしているので、下のサンプルは音を前提とした数値になってます。 使い方 tap N に作りたいデジタルフィルターのタップ数(奇数)を入力。 Sampling Frequency に処理したいサンプリング周波数を入力。 Cutoff Frequency にカットオフしたい周波数を入力。これ以上の周波数がカットされる。ローパスフィルターなので、低い周波数のみ通過する。 calculate ボタンを押すと計算される。 下のテキストエリアに タップ数分の係数が出力される。タップ数が多くてテキストエリアに表示しきれなかった場合は、スクロールするか、テキストエリア右下をマウスでドラッグするといくらでも広げられます。 FIR LOW PASS Filter hamming w

LEGO Mindstorms IrTower改造

イメージ
IrTower本体からUSBケーブルが伸びているのだが、ケーブルは長く硬かったので取り回しが悪かった。そこでUSBケーブルを着脱可能にしてみた。タワー本体にminiBコネクタを設けることで、汎用USBケーブルを利用可能にした。ノートパソコンを使うので、ケーブルの長さは50cmもあれば十分。この改造によって持ち運びも楽になった。 IrTowerの内部はこんな感じで、元々は基板に直接ケーブルがはんだ付けされていた。ケースは若干削っている。 基板のアップ。3つある青い色のLEDが赤外線LED。白い色のLEDは送受信の際に発光する通常のLED。 自作USB miniBコネクタ基板。この基板をケース内部に固定させた。コネクタは以前、秋月電子で4個200円で買ったもの。 よく使われているminiB。 miniBオスのピアンサイン 5ピンあるけど使っているのは4ピンだけ。 1 VCC 5V 赤 2 -D   白 3 +D   緑 4 GND   黒 コネクタの位置は下のところ。本来ここからケーブルが出ている。 ケーブルを接続するとこんな感じ。 接続部分のアップ。

LEGO Mindstorms RCX1.0 で leJOSでも

イメージ
子供がプログラムを始めたので、随分前に買ったレゴマインドストームRCXを利用することにした。言語はJava。でもマインドストーム用にアレンジされたleJOS(レホス)というもので、コンパクトで扱いやすい環境。 マインドストームにはグラフィカルなプログラム環境も提供されているが、あまりプログラムの勉強にならないような気がしたので、いきなりleJOSを使うことにした。ちょっと難しいかなと思ったが、意外と抵抗なくスラスラとアルゴリズムを考え出したので心配は無用だった。このBlogには、何をやったのかを備忘録程度に残しておこうと思う。 マインドストームとは? マインドストームとはレゴ社が開発したレゴブロックを基本に、マイコン、モータ、センサー等がセットになったシステム。パソコンでプログラミングすることでロボットなどを自作することがでる。レゴブロックの特徴であるパーツの自由な組合わせと、プログラミングのコンビネーションは、おもちゃとしての領域を超えて、2000年ぐらいから教育現場を中心に教材としても広く使われるようになった。マインドストームは現在NXT(2006年発売)というシリーズへ移行。ここで扱うのは1998年に発売された初代のRCX。もう生産終了しているモデルで、現在のNXTとはハードもソフトも大きく違っていて、互換性はない。 RCXの主な仕様 CPU: 8bitマイクロプロセッサH8/3292 16MHz(日立→ルネサス エレクトロニクス) メモリ:  ROM 16kbyte CPU内蔵(0x0000~0x3fff) (512BのオンボードRAM) RAM 32kbyte 外部RAM(0x8000~0xffff) (ファームウェアとユーザプログラムを入れる) インターフェース:  センサ制御ポート(input port)×3 モータ制御ポート(output port)×3 赤外線通信ポート×1 LCD 5文字(7セグ) ボタンスイッチ×4 サウンド制御 (ビープ音) インターバルタイマー 電源 乾電池 単3形 ×6本(9V) AC 9~12V (交流を入れる仕様 日本ではあまりお目にかからない) IrTower パソコンとRCXの赤外線通信に使う重要なアイテム。 マインドストームRCXをJ

音程差から周波数計算 JavaScript

音程差から周波数を計算するプログラム。使い方としては基準音のAの音に対して音程差を入力すると周波数を計算する。基準音なら「0」、半音上なら「1」、オクターブ上なら「12」、オクターブ下なら「-12」という具合。さらに、「1.5」とか1/4音も計算できます。 Calib. A: Hz Interval: Half Step Frequency: Hz スクリプトはこんな感じ。 <HTML> <HEAD> <TITLE>frequency calculate</TITLE> <script type="text/javascript"> <!-- function calcF(){ goukei=0; var num1= document.formF01.elements[0].value; var num2= document.formF01.elements[1].value; var num3= num1*Math.pow(2,(num2/12)); document.formF01.hz01.value=num3; } //--> </script> </HEAD> <BODY> <form name="formF01"> Calib. A <input type="text" value="440">Hz<br> Interval <input type="text" value="0"><br> <input type="button" value="calculate" onClick="calcF()"><br> Frequency <input type="text"name="hz01">Hz<br> </BODY> </HT