投稿

IIR デジタルフィルタ Javaで自作

イメージ
少ないタップ数で実現できる IIR (Infinite impulse response 無限インパルス応答)デジタルフィルタ。LPF/HPF(ローパス/ハイパスフィルタ)でも試しに作ってみようかと思う。図書館で借りた本を頼りにプログラムまで作ることにしてみた。 これまでに作ったFIRはタップ数が多く計算量が増えてしまうのに対して、IIRは極端にタップ数が少なく1~8程度。無限のフィードバックを利用することで少ないタップを実現している。欠点は位相のズレが出てしまうことと、条件によっては不安定になりやすいことなど。AudacityのLPF/HPFはIIRのButterworthを使っているので、いろいろ試したら欠点はやはり位相だと思えた。元の波形が結構大きく変化してしまう。FIRで同じようにLPF/HPFを作ると、波形の乱れはなかった。その差は歴然。ただIIRは計算量が少ないので、ディレイやリバーブ内のLPFとして使う場合には都合がよい。 IIRは元々アナログ回路用のフィルタなので、アナログ回路設計を雛形にしてデジタルに変換するという設計が基本のようだ。IIRで作れる有名なフィルタは Butterworth、Chebyshev、楕円フィルタなどがある。実際使いそうなフィルタは平坦な特性のButterworthぐらいなので、これだけ試すことにした。基本となるブロック図は以下のようなもの。図は4次のブロック図。このan、bnに係数を入れることでフィルタになる。anはフィードバックになる。さらにカスケードするなどの改良型もある。 内容を理解しようとしたら、結構難しいかも。まずは下の式から次数ごとのバターワースのプロトタイプというものを作る。 とりあえず1次から4次までのプロトタイプは数式でこのようになった。 1次 2次 3次 4次 次に求めたい特性に応じて、どの次数のButterworthを使えばよいかを計算する。Butterworthはカットオフ周波数が-3dBになるように計算されている。単純に次数が増えれば急な傾斜を実現できる。軽く高域を削る程度なら1次でよいこともあるし、完全なカットをしたいなら4次でも不十分になる。ちなみにAudacityでは1次、2次、4次、6次、8次のButterworth HPF/LPFが用意されている。

周波数から音名とcent表示する JavaScript

周波数から音程をチェックするためのJavaScriptを書いてみた。個人的にたまにやりたくなる計算。以前は関数電卓にプログラムを書いて実行していた。でも、たまにしか使わないので、実行方法とか忘れてしまうのが、たまにきず。そこでJavaScriptの出番。この手の関数電卓規模の計算ってJavaScriptと相性いいかも。簡単に書けて実用的。 周波数を入力すると、その音がABCDEFGの音名で表示される。 Calib. A Hz Frequency Hz Interval Note Cent 簡単な説明 Calib. A は基準となる周波数。普通は440Hz。 Frequency ここに音名を知りたい周波数を入力。 calculate ボタン。これを押すと計算される。 Interval 基準周波数からの音程差を表示。半音が1となる。1オクターブは12となる。 Note 音名を表示。 Cent セントは半音を1/100にした単位。上の音名に対してプラスマイナス50セントの範囲でズレを表示。0に近ければジャストに近い。 下は参考までに、基準音440Hzのときのギターの開放弦の周波数。 1弦開放 E 329.627Hz 2弦開放 B 246.941Hz 3弦開放 G 195.997Hz 4弦開放 D 146.832Hz 5弦開放 A 110.000Hz 6弦開放 E 82.406Hz 中学生ぐらいから学ぶフーリエ変換 目次

FFT 基礎実験 Java

イメージ
FFT(Fast Fourier Transform)高速フーリエ変換も作ってみる。昨日の 音声ファイル用DFT の一部を改造してFFTを組み込む。機能ごとにクラスをきれいに分けて作ると簡単に組み込むことができることを実感。 FFTのアルゴリズムはコンピュータ処理に適した巧妙なしくみになっている。バタフライ演算で計算を減らす工夫がされている。データが多くなればなるほど、DFTとの差が出てくる。DFTだとデータ数Nとすると、N^2の乗算が必要なのに対して、FFTはN log 2 N/2で済むようだ。少ないサンプル数で乗算を数えてみたら、計算式通りではないが、まぁ近い数かな。同じ計算で符号違いも多いので、うまく最適化すれば、より高速になる。実際の実用レベルのFFTではそのように作られているようだ。とりあえず理屈どおりに組み込んで試してみると、DFTに比べて、圧倒的な処理スピードは体感できた。これなら1万サンプル以上でも苦ではない。 音声ファイルにおけるフーリエ変換の細々したことは こっちのDFTページ を見てください。とりあえず結果だけは下のようになった。 sin波1000, 5000, 10000,15000,20000Hzを合成した波形をFFTにかけてみる。出力ファイルをLibreOfficeのCalcでグラフ化。出力を確認。ピンクはdB表示でグリーンはリニア表示。 sound programming 目次はこちら

FIR The Frequency Sampling Method 実験 Java

イメージ
FIRのLPFとHPFを設計してみて、もう少し高度なことをやってみたくなった。ということで、日曜日はThe Frequency Sampling Methodにチャレンジ。特徴としてはLPFやHPFに比べ自由度の高いフィルターが作れるというところ。周波数ごとにフィルターを掛ける割合を微調整できるので、グラフィックイコライザーやパラメトリックイコライザーのようなことが実現できる。解像度を上げていけば市販品をしのぐことも夢ではない。LPF/HPFと同じようにJavaでデジタルフィルタ用の係数を出力するところまで、つまりインパルス応答を得るまで作る。 これを実現するにはフーリエ変換を勉強しないと手が出ない。以前勉強したのだが、すっかり忘れた。またちょっとメモを読み返したりして再勉強。 結論としては、IDFT(離散フーリエ逆変換)の式をプログラミングすることで、実現できそうだ。あとは、やりながら考えるのが手っ取り早い。細かな部分まで完全に理解しようとすると数年かかりそうなので、厳密さは無視して、ガンガンとプログラムを組んでみる。それにしても、この手の日本語情報は少ないなぁ。うまく見つけられないだけなのか? 結局下の英語ページを読みながら、プログラムをする。 http://cnx.org/content/m28292/latest/ h(n)がFIRのタップの係数に相当する。この(n)は無限大個数あるのが理想。でも当然無理なので、オーディオの場合は最低でも数百とかにする。LPFならもっと少なくても良いのだが、HPFを考慮するとまだ足りない。今回はサンプリング周波数44100Hzのオーディオファイルを使う。低域もきれいに加工したいので、タップ数は1万ぐらい欲しくなる。さらに直線位相特性などを考慮すると、その2倍というところだ。ということで2万程度で実験した。 H(k)は周波数域を分解したそれぞれの係数。Hには任意の0~1.0を入れる。自分が欲しい周波数特性をここでコントロールする。(k)を増やすと分解能が上がるので細かく周波数をいじることができる。今回は22050個にした。つまり扱える周波数を22050分割。サンプリング周波数44100Hzの場合、扱える周波数は22050Hzまでなので1Hz単位で制御できることになる。 式にeとかiがある。この手の専門教育

FIR LPF/HPFの係数プログラム Java版

イメージ
昨年JavaScriptで書いたものをJavaへ移植してみた。意外とフィルタ係数関係のアクセスが多いので、2012年はデジタルフィルタ関係、もしくは音響関係を少し充実させようかな? 下のFIRなども、原理や用途など後々解説します。個人的には図書館などで資料を少しあさったり、大学の先生のホームページなどを参考にプログラムしているのだが、説明が難解という印象があるので、中学生ぐらいでも分かるように、まとめていこうかと思っている。ちなみに私は元々文系寄りで、情報等の専門教育は受けたことはないです。すべて独学なので間違っていることもあると思います。たまに質問がくるので、ここでお断りしておきます。学生の方は先生に聞いてください。 プログラムの内容はFIRのLPF/HPFで、 こちらのページ のJavaScript版 ( 120111 窓関数を追加) と基本的には同じ。機能として増やしたのは窓関数をHammingだけでなくHanningも加えたことと、フィルタ係数すべてを配列に格納したところ。実行すると、パラメータの値に応じて、プロンプトにフィルタ係数を出力するようになっているので、自由に書き換えてみてください。そのフィルタ係数をAudacity等に読み込んでみると、下のような波形、つまりインパルス応答になる。 下はLPFの場合。わかる人には馴染み深く、そうでない人はさっぱりの世界。 下はHPF。デルタ関数みたいな地味なかたちだが微妙に波打っている。 参考までにデルタ関数は、1サンプルだけレベルが1になっている。いろいろ便利な関数で、重要なもの。 FIRの係数を求める式 n はタップのn 0 , n 1 , n 2 ・・・で、h(n) はタップn番の時の係数hという意味。ωはカットオフ周波数。0~ π の範囲で設定する。周波数(サンプリング周波数の1/2)の半分なら π /2。1/3であれば π /3。上記はLPFであれば、わりとそのまま使える。HPFは、若干いじることで実現できる。下のソースを見ればどう計算しているか分かると思うけど、ちょっとゴチャゴチャしている。変数も減らして、シンプルにきれいに書き直せばよいのだが、とりあえず動くのでそっとしておく。出来た係数を見比べるとLPFとHPFでは中央値以外はプラスマイナス

dB(デシベル)とbit(ビット)の関係について

イメージ
デシベルって? サウンドでよく使われるデシベルは、基準となる音に対しての対数比で音量差を表したもの。 なぜdBを使うかというと、いくつかの理由がある。 小さな数から大きな数までを一緒に扱いやすく、それらを簡単に計算することができるから。 また対数は人の感覚に近く、イメージしやすいことなどが上げられる。 人の聴覚は小さい音に敏感に反応し、大音量になるほど鈍感になっていくるというもの。これがdBであらわされた数値に近い。例えば物理量で10倍の音量になっても、そこまで大きくなったとは感じない。2倍程度に感じるというのが一般的な話。 デシベル表示だと20dBということになるが、 ベル表示では一桁減らして2となり、ちょうど人間の感覚に近い数値になる。 また人は0~120dB(100万倍)までが聞き取れる範囲。このことはオーディオ等に求められているダイナミックレンジは120dBあれば十分ということを意味する。 オーディオ機器などでは最大音量を基準とし、0dBと決めている。そのため扱われる音量はマイナスdBで表示される。 物理量からdB(電圧比)を導く計算式 G[dB] = 20log 10 (Vo/Vi) G:デシベル換算した比 Vi:入力音量 Vo:出力音量 反対にdB(電圧比)から物理量を導く計算式 Vo/Vi = 10^(G/20) 物理量 デシベル 等倍 0dB 1/2 -6dB 1/3 -10dB 1/10 -20dB 1/100 -40dB 1/1000 -60dB 1/1万 -80dB 1/10万 -100dB 1/100万 -120dB 下記はデシベルと物理量のグラフ。上記と違いプラスで表記している。見やすく実用的な範囲の40dBまでをグラフにしてみた。 約30dBまでは、物理量がデシベル値よりも小さく、その後は逆転し、デシベル値がそれほど増えなくても、物理量は、すさまじい勢いで大きくなっていく。 感覚的にあると便利なのは20dB差は10倍だということ。40dB差であれば100倍で、60dB差であれば1000倍という感じ。 ビットって? サウンドのビットは音量の分解

32-bit float IEEE 754 浮動小数点数について

イメージ
自作サウンド・エフェクト を32-bit floatに対応させた。そのときに32-bit floatについて改めて調べてみた。少し疑問もあったので、それを明確にするのが目的。はじめネット上の情報で理解できるかと高を括っていたが、知りたいことがズバリ書いているところが見つからなかった。仕方なく32-bit float IEEE 754の原理を調べて、その後はプログラムを組んで確認していった。そのときのメモ。 無圧縮音声ファイルのWAV 32-bit floatを扱うための知識 floatの数値で音声ファイルに重要なのは、-1~0~+1の範囲。下の絵はAudacityのトラック部分。上下のレベルは-1~0~+1に対応している。この部分が、どのような精度で記録されていくのかを調べてみた。16bitや24bitと比較してどうなのか? という点も重要。その差は問題となるのか? など。 WAVフォーマットでは32-bit floatをそのまま利用しているので、1を超える数値や-1以下の数値も扱えてしまう。そういう部分にも触れたいと思う。 疑問点 そもそもの解像度を知りたいというところから始まった。漠然とかなりの解像度であることは分かっていたが、計算すると、かなり不思議な値が出てきた。0に近いほど精度が上がっていたり・・・ やたら大きな数も扱えたり・・・ 表現出来る範囲は32bitのはずだが・・・ こんな感じで、その仕組みを知る必要性を感じはじめた。 ビットとは? デジタル音声ファイルで、よく聞くビットというのは、Audio bit depth のことで、音量レベルの解像度のこと。CDでは16bitが使われている。最近のデジタルレコーダーなどは24bitなどが採用されている。波形編集ソフトのAudacityでは様々なビットを扱うことができる。このビット数が高いほど細かな音量差を表現出来ると考えてよい。ただこのページの32-bit floatは、ビットの後にfloatという言葉が付いている。floatは浮動小数点数が扱えることを意味する。ビット数は同じでも表現出来る数値が違ってくる。 浮動小数点数 Javaで扱える数字の型はいくつかある。その中でfloat、doubleは小数を直接扱うことができる。つまりこれ以外は少数は直接扱えない整数型。fl

Audacity Tips

イメージ
知っていると、ちょっと便利なチップを書いておくページ。 各種設定ファイルをAudacity.exeと同じ階層に格納する  111220 Audacity.exeと同じ階層にportable settingsフォルダがあると、各種設定ファイル(エフェクトの設定なども)をそこに格納する。デフォルトでは、このフォルダはなく、ウィンドウズの場合、C:\Documents and Settings\ユーザー名\Application Data\Audacity\ ここに保存される。 定義ファイルなどを直接いじったりするような使い方をする人はアプリケーションと同じフォルダにあると、あちこち開く必要がなく便利。またUSBメモリ等にAudacityを入れて、他のPCで作業するときなども有効。注意点としてはバージョンアップするときに、設定等を反映させるには、手作業でフォルダをコピーする必要あり。 180421 Windows10においては、settingファイルは以下になった。 C:\Users\user\AppData\Roaming\audacity また、残念ながらAudacity.exeと同じ階層にportable settingsフォルダを入れても無視されるようだ。 レイテンシの設定  111127 多重録音では必須のレイテンシを調整してみた。 使用機材は、PCがThinkPad X61でオーディオインターフェイス兼ミキサーがALESIS MultiMix 4 USB。これにダイナミックマイクを接続してギターなどを録音している。 Audacityで録音した音を再生して、それを聴きながら2回目の録音をする場合、何も設定しないと、1回目と2回目の録音がズレてしまう。これを調整するのが Latency correction。 AudacityのPreferencesを開いて、Recording > Latency > Latency correctionで調整する。録音トラックは再生トラックよりも遅れるために、その遅れを録音後に修正するための秒数を設定する。 自分の環境では  -154.6773 milliseconds   になった。 秒数の決め方 Auda

Audacity Effect VSTについて

イメージ
220911更新 VSTとは? AudacityではDAW(Digital Audio Workstation)で標準的になったエフェクト規格であるVSTが扱える。VST(Virtual Studio Technology)は、スタインバーグ社(ドイツ)のプラグイン規格。VSTには大きく分けて2種類ある。VSTiと言われる音源タイプと、VST、VSTeなどと言われているエフェクトタイプ。 Audacityで使えるVST エフェクトタイプのVSTeのみ有効。音源であるVSTiは使えない。 Audacityが64bitになったことで、VSTも64bit版が使えるようになった。 VSTのバージョンは現在のところVST2までで、VST3は、まだサポートされていないが、Audacity3.2からはサポート予定となっている。 VSTプラグインの入手先 VSTの入手は下記URLなどを参考に。膨大なVSTエフェクトがある。 http://www.kvraudio.com/ インストール方法 各ホームページ等でダウンロードしたVSTプログラムである.dllをAudacityのディレクトリにあるPlug-Insフォルダに入れ、 EffectメニューのAdd/Remove Plug-ins...でEnableにする。 また前提として、環境設定:エフェクトでVSTにチェックが入っていること。 VSTウィンドウ 下はVSTプラグインを表示させたところ。 Play / Backward / Forward ボタン 再生しながらVSTを設定し、リアルタイムで変化を確認できる。Audacity 2.1.0 から、これが可能になった。Audacityはリアルタイム処理には向いていないので、こういう機能は諦めていたのだが、ついに実現してしまった。 Manage presets and options ボタン このボタンをクリックすると以下の内容が表示される。 User Presets: 任意の設定がここに登録される。 Save Preset: 任意の設定を保存するときに選択する。そうすると User Presets に登録される。 設定情報はC:\Users\

Audacity Effect Menu (エフェクト) LADSPA part4

イメージ
220911更新 現時点のAudacity3.1.3では、LADSPAプラグインはすべて排除されてしまった。それでもサポートされ続けてほしい。自作プラグインをいくつか使っているので、使えなくなるのは辛い。下記の以前書いた記事はそのままにしておく。 180720更新 LADSPAはLinuxでは標準的なエフェクト。 ver2.1.1ではLADSPAエフェクトは、1つしか入っていないが、 公式ページ から90を超えるプラグインをダウンロードできる。 またLADSPAを拡張したLV2という規格のプラグインも扱えるようになった。 Windowsでは.dllで提供されている。 現行バージョンではVSTと同じようにリアルタイムプレビューが可能になり、設定の保存も出来るようになり使い勝手は大幅に向上した。 Winでは以下のファイルに保存されている。 C:\Documents and Settings\USER\Application Data\Audacity\pluginsettings.cfg しかしながら、まだまだ不安定な印象で、うまく保存できなかったり、リアルタイムプレビューはエフェクトによっては使えなかったりする。 LADSPAはシンプルな仕様なので、C言語が少し理解できれば比較的簡単に自作することも可能。 個人的にAudacityで実験するためのプラグインをたまに作っている。 自作LADSPAなどのプログラムはこちら LADSPA Effects SC4 (LADSPA Effects) コンプレッサー コンプレッサー。今回レビューにあたり、初めて使ってみたが使い勝手はよさそうだ。Audacity標準コンプレッサーよりも、こちらの方が普通のパラメーターが並ぶ。 特徴としてはRMSとピークの両方を見れることだろう。RMSは実効値、一定時間の平均の音量のようなもの。 RMS/Peak:0~1 これの挙動がわかりずらいので、下図のようにドラムのようなピークのある波形に適用してみた。ピークが鋭くない波形だと違いはほとんど出ない。 設定画面RMSを1にした状態。つまりピークを見ているので、ピークの値がThresholdを超えたら圧縮すること