トピック
V.D. 5962-63214-97513

周波数の判定

マイクで拾った音の周波数を計算したいのですが、どうしたらいいのでしょうか?
6そうだね
プレイ済み
返信[1]
親投稿
ΖΕΧ ZEX256
フーリエ変換
5そうだね
プレイ済み
返信[2]
親投稿
つばさ☆ nsm2116
フーリエ変換から判定する。 FFTとかIFFTとかあったよね。
1そうだね
プレイ済み
返信[3]
親投稿
Hanzo rzsense
単音の周波数を知りたいのであれば、音の波形のピークとピークの間の時間を測って、その逆数を取ればそれが周波数になりますが、恐らくは和音の中に含まれる周波数を全て知りたいのだと思われるので、前のお二方のご指摘どおり、FFT(高速フーリエ変換)という方法を使って、周波数を計算するのがベストです。 もし「高度サウンドユニット」をお持ちであれば、このFFTを簡単に実行できますが、そうでなければ、FFTのアルゴリズムをご自分で作る必要があります。
2そうだね
プレイ済み
返信[4]
親投稿
V.D. 5962-63214-97513
ふーりえへんかん?
1そうだね
プレイ済み
返信[5]
親投稿
V.D. 5962-63214-97513
高度サウンドユニットは持ってます。 でも、ふーりえへんかんとやらの使い方を分からずにいます。
1そうだね
プレイ済み
返信[6]
親投稿
Hanzo rzsense
せっかくなので、やってみましょう。 まず、配列を4つばかり定義して、中身を0に統一します。 DIM IRE[8192],IIM[8192],ORE[8192],OIM[8192] FILL IRE,0:FILL IIM,0:FILL ORE,0:FILL OIM,0 次に、サンプリングレートを8180Hzとして、8ビットでも16ビットでもいいので符号付きで録音し、配列IREにマイク音声データをコピーします。サンプリングレート8180Hzで、要素数8192の配列なら、1秒ちょっとぶんの音声データになります。このあたりは大丈夫ですよね?
2そうだね
プレイ済み
返信[7]
親投稿
ぴくと kanau1203
周波数の異なった正弦波の和で表そうというもの(多分)
1そうだね
プレイ済み
返信[8]
親投稿
Hanzo rzsense
以上で下準備は終了です。次はFFTですが、 FFT ORE,OIM,IRE,IIM:ARYOP #AOPMUL,ORE,ORE,ORE これだけです。これだけで、配列OREの中に、どの周波数成分の音がどれだけ含まれるかという情報が格納されます。 具体的には、ORE[8191]が、8180Hz(サンプリングレート)の音の強さ、ORE[0]が0Hzの音の強さを表します。ORE[4096]は8180Hzの半分、つまり4090Hzの音の強さ、ということになります。ますはこれに従って、横軸に周波数、縦軸にORE[]としてグラフを描いてみましょう。 ちなみに、FFTでは、配列の半分より上のデータ(この場合は要素番号が4096以上のデータ)は正しくありません。これはいわゆる「標本化定理」というものですが、まぁあまり深く考えず、そういうものだと思ってください。
1そうだね
プレイ済み
返信[9]
親投稿
Hanzo rzsense
ORE以外に定義した配列はどうなったのかを心配される向きもあるでしょうが、これについては、複素数という概念の説明が不可避なので、現在の私の科学力では、恐縮ながらわかりやすく解説することができません。 ご要望があれば、勉強して回答致します。
1そうだね
プレイ済み
返信[10]
親投稿
MIKI ifconfig
re だと、波形が遇関数の時しか正しく表示されないような・・・ 周波数ごとのパワー(電力) は、「複素数の絶対値の二乗」つまり power[i] = ore[i]*ore[i]+oim[i]+oim[i] です。周波数ごとの電圧(つまり振幅)は 「複素数の絶対値」つまり√電力 になるので v[i] = sqr(ore[i]*ore[i]+oim[i]+oim[i]) となります。 音響パワーはデシベル表示するのが普通なので、横軸に周波数、縦軸に db[i] = log(power[i], 10)*10 = log(ore[i]*ore[i]+oim[i]+oim[i], 10)*10 でプロットしてみましょう。
2そうだね
プレイ済み
返信[11]
親投稿
Hanzo rzsense
世の中に存在する波形は、さまざまな周波数の正弦波の合成で表される、これがフーリエ変換だと言われますが、正しくは、さまざまな周波数の正弦波「と余弦波」の合成、です。実は、FFTの結果のORE、OIMは、それぞれ正弦波と余弦波の強さを表します。じゃあ、正弦波はいいとして余弦波って何なの?と言われると、何のことはない、正弦波にくりそつだけど、位相が90度ずれている波のことです。0度から360度まで全ての位相を表現するには、正弦波と余弦波の両方が必要なのです。
2そうだね
プレイ済み
返信[12]
親投稿
Hanzo rzsense
そのようなわけで、MIKIさんのご指摘どおり、OREだけだと正しい結果が得られないことがあるので、OIMも使って、パワースペクトルを求めましょう。 そのためには、次のようにします。 FFT ORE,OIM,IRE,IIM ARYOP #AOPMUL,ORE,ORE,ORE ARYOP #AOPMUL,OIM,OIM,OIM ARYOP #AOPADD,ORE,ORE,OIM 以上により、OREにパワースペクトルが格納されます。 MIKIさんのご指摘内容を参考に、グラフに書いてみてください。
3そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
あらら、式間違ってた・・・ × power[i] = ore[i]*ore[i]+oim[i]+oim[i] ○ power[i] = ore[i]*ore[i]+oim[i]*oim[i] 以降全部間違ってる・・・・(泣
2そうだね
プレイ済み
返信[14]
親投稿
Oskar oskar_liebig
ちょっとだけ便利な #AOPMAD ってのがありまっせ FFT ORE,OIM,IRE,IIM ARYOP #AOPMUL,ORE,ORE,ORE ARYOP #AOPMAD,ORE,OIM,OIM,ORE
3そうだね
プレイ済み
返信[15]
親投稿
V.D. 5962-63214-97513
皆さんありがとうございます!コレハナカナカタメニナッタゾ。 これは理解に時間がかかりそうだ…
1そうだね
プレイ済み
返信[16]
親投稿
つばさ☆ nsm2116
影でポツンとコメントしてる自分も頑張って理解しようとしているのであるw
2そうだね
プレイ済み
返信[17]
親投稿
V.D. 5962-63214-97513
皆さんありがとうございました。 トピック閉じます
0そうだね
プレイ済み