1 :
デフォルトの名無しさん :
2007/07/25(水) 14:07:56
2get
3 :
デフォルトの名無しさん :2007/07/25(水) 16:24:53
用語を統一するために リアルタイム バッチ処理の対語で、ゼロレイテンシの事ではない。 遅延はあっても途切れずに処理する事をいう レイテンシ ADCからDACまでにかかる時間の事だったり DSPの掛け算なんかで命令から実際に答えが出るまでの命令サイクル数の事だったり DSP デジタル・シグナル・プロセッサ の場合は信号処理用のMPUの事 デジタル信号処理の事を言う場合もある
最近サウンドプログラミングに目を向け始めたんだけど ソフトシンセに関して書かれた本とかってないの?
,,.-‐'''"´ ̄ ̄ ̄``丶、 ,,.-'"´ ``丶、 / :/ .、 、 丶 / :::.:/! :::/ :|. T:、_.:::.:ヽヽ.:::.::: ヽ /:/ ::::l:ア.:::/|.::::|! ::.:::.::: |.:::l、.:::.::丶.:::.:::.:::.:::. ヽ /.::/ .:::.:l|!.::/ .|.:::|!.:::.:::.:::.:::.:|:.:::lヽ.:::.:::.:ト、.:::.:::.:::.:::.::::l l.::/! .:.:::.:::|!.:::| |.::|」 .:i:.:::.:::.::|.:::メ、_ ヽ.::::l ヽ.:::.:::.:::.i::.::l .|::/ |:::::::::::::|!::| _,,.イ!_ヽ:::l::::::::::|!ソr _二ニァi- l::::::::::::l:l:::ト |!:l |::::::::::_,.ィ匕.r=テミ、 ヽ:l:::::::| ! イ 于ミヽ、 |:::::::::::|ア!:|:ヽ 出席番号5番 l! |::::::::、:::l::|'´i'丿;;ヽ ヽ::::| l‐'´;;;::|! `|:::/:::::l|::l:lt、::l 和泉亜子が5get ! ト、:::::l::::l! _|_::::::::_i!. ヾ! 丶--≡‐、l::イ::::/.`l!l::l!ヽl |::ヽ:::ヽ:|.イ-' ̄ 丶 `´ソノ/::/ ノ!ヽ::l 丶、 .|:::::入:ヽヽ _,,.--、 ソ l∠ィ'l´j ヽ! |:/ヽヽヽ.Y-、_ 「 ̄  ̄ ン‐、 ,.イソ/ .レ' ! '´ ヽ/_,,.-‐'''`L _,,.∠__\!l/ ! ,r─‐ァ'´ .-‐'''"ヽヘ__/,⊥,,__ ヽr───‐-、 /.| ヽ -‐'''"´┤ 〉L__ / 入 / ヽ \ | { / / ヽ
>>3 リアルタイムじゃなくてインタラクティブと呼ぶと良さげ
マルチメディアなスレみーっけ!
__i.\,/!_ ゝ, ''´⌒`ヽ ノノメノハノ〉〉 |\ルリ!゚ ヮ゚ノ∩ やっぱり最強なあたいがHゲットよ! \ と)i`\´iノ ∠ ,く// i ゝ '`"!ンィン'´
とある音源Aと、イコライザなどを使いAの特定の部分の周波数を強調した音源Bから 周波数のどの部分が加工されたかを知るにはどうすればいいんでしょうか。
Spectrogram を PrintScreen して Photoshop に hariko して XOR を掛ける
☆SHI☆NE☆YO☆
周波数の強調などのフィルタは普通は線形だから 入力A 出力B フィルタF なら B = F*A だからFを求めて、このFの周波数特性を求めるという事になる。 方法は 1、A,BをFFTして、 周波数軸上でB/Aを求める 2、適応フィルタ PARCORフィルタなどで、Fの近似値を求めて このFの係数から特性を出したり、 Fにホワイトノイズや周波数スイープを入れて特性を出す
単純にB-AをやってからFFTして、 一番でかかった周波数帯を見れば良いんじゃないかしら?
それは旨くゆかない。イコライザーなどはIIRフィルターなので、位相も変化してるし FIRフィルターであっても、BとA間には遅延があるので B-Aではダメだよ
15 :
デフォルトの名無しさん :2007/08/03(金) 21:11:19
即死判定予防
サウンドカードの入出力を利用してオーディオ用のディジタルフィルタ(リアルタイム)を 実現してみたいので参考になるホームページお願いします。
基本的にサウンドカードの入出力でエフェクトするのは環境依存。 最近のマザー付属のものでは、入出力を同時に出来るものも増えてきてるけど 一昔前は、入出力を同時にすると、入力がそのままハード的に出力に出て来たりとかのが多かった。 2枚刺しなどで入力と出力を別ボードとなると、サンプリングレートの微妙なずれでだんだんとズレてゆく あるいは1枚のものでもズレるものが多かった。 つまり、エフェクトするには、まず入出力でサンプリングが同期して、 かつ入出力がハード的に分離してるハードである事が条件だ。 それを解決していれば、あとはwindowsなら低レベルオーディオAPIで -->ヘルプ【低レベル オーディオの概要】 WAVEHDR 構造体を、in/out用に複数用意して それをコールバックかメッセージ駆動で 順に再利用してやればいい。 C++でもDelphiでもそういうコンポーネントを1回作っておけば、後はとても楽チン
アドバイス有難うございます。 開発環境はBCC5.5.1(C言語)とWin32APIを使ってます。 ハードは比較的新しいマザーP5Bですので対応大丈夫と思います。 ただ、ゴーグル検索でオーディオ入出力を同時に行っているサンプルが見つからず???な状態です。 良いサンプル落ちてないですか?
20 :
18 :2007/08/05(日) 16:44:55
>>19 すごい親切な方熱烈感謝です。
先ははるかに遠いですが、なんとなく流れの概要がつかめました
(全体の流れがつかめないとどうしようもないですから助かりました)
先ずは入力を出力に出すだけの音声スルーを実現にしたいと思います。
3.で出力用データが用意されてないのにwaveOutWriteしてますが、
出力用データはどうするのでしょうか?
MM_WIM_DATA、MM_WOM_DONE処理はこんな感じでよいですか?
*MM_WIM_DATAを受け取ったら、
最初のMM_WIM_DATA ならwaveOutRestartする
入力データに対するを処理する(エフェクト)
それFIFOに書き込む
受け取ったWAVEHDRをwaveInAddBufferする(WAVEHDRの再利用処理)
*MM_WOM_DONEを受け取ったら、
受け取ったWAVEHDRをwaveOutUnprepareHeaderする
出力データをFIFOから読み込み、受け取ったWAVEHDRのlpDataバッファに転送する
そのWAVEHDRをwaveOutPrepareHeaderする
waveOutWriteする
>3.で出力用データが用意されてないのにwaveOutWriteしてますが まあ途中のFIFOがいっぱいになってから、出力WAVEHDRを書いてもいいんだけど >入力--WAVEHDRのマルチバッファリング-->FIFO-->出力のWAVEHDRのマルチバッファリング と、全部が遅延要素だから、出力側のマルチバッファリングにはゼロでも埋めて 出力をスタートしようって事 後はOK
22 :
デフォルトの名無しさん :2007/08/06(月) 10:51:32
すみません。 wavOutWriteで2つ以上の波形をミックスした音を出したいのですが、合成のやり方がわかりません。 データは16ビットモノラルです。 char* buf1,buf2,out_buf;//元データ short* in1 = (short*)buf1; short* in2 = (short*)buf2; short* Out = (short*)out_buf; for(int i=0;i<BUFFER_SIZE/2;i++) { Out[i] = in1[i] + in2[i]; } こんな風にすると、音割れが発生してしまいます。どうすればよいのでしょう。
そりゃぁ、単純に足しちゃダメだろ。安直にやるなら平均だけど、それで事が足りないなら調べて工夫すればいい。
>22 in1[i] + in2[i] の結果を -32768 〜 32767 でクリップするだけでもだいぶマシになる。 真面目にやるならソースの音量を調整するなりコンプレッサつけるなりしないとダメ。
サウンドプログラムってやったことないおれがいいかげんレスすると 演算のオーバーフローで音割れ発生なら Out[i] = in1[i]/2 + in2[i]/2; や int tmp = in1[i] + in2[i]; Out[i] = tmp/2; したらどう?
>>25 それ、>23で指摘している平均ですから。
俺は夏の間だけ2乗平均するゼ
平均てか、オーバーフローしないように音量下げてるだけでしょ。 単純に足すの自体は正しいけど、フルボリュームの音2つ混ぜればレベルオーバーして割れる、ってあたりまえの話し。 割れないようにするには基本音量調節だけど、 クリップ処理はしといたほうがいい。でないとクリップしたとき醜いことになる。 整数処理の場合、混ぜた結果をクリップ処理するならshortじゃなくてlongとかで足し算しないとね。
色々と突っ込みどころだらけだな。 >単純に足すの自体は正しいけど、フルボリュームの音2つ混ぜればレベルオーバーして割れる、ってあたりまえの話し。 「混ぜる」が「足す」であることが前提となっているが、「混ぜる」ことと「足す」ことはイコールではないぞ。 フルボリュームの音を足すとレベルオーバーするから、そうならないように混ぜないといけないという、当たり前の話だね。 ×話し ○話 >クリップ処理はしといたほうがいい。でないとクリップしたとき醜いことになる。 何が言いたい。字義通りに解釈すると、「クリップしないとクリップしたときに醜い」となって意味不明なのだが。
重箱の隅
隅の多い重箱だな
石頭
>28 アホだコイツw レベルオーバーで割れるのはクリップしても割れるだろうが、嘘教えてんな それを言うならオーバーフローだろボケ 用語は正しく使え、知らないなら黙ってろ
クリップ処理すればレベルオーバーしても割れないなんてだれも書いてないと思うけど、 とりあえず、君が正確な用語で簡潔に説明してやればいいんじゃない?
35 :
18 :2007/08/06(月) 21:32:43
>>21 有難うございました。
また、質問すると思いますが、そのときはよろしくです。
>>25 細かいことだけど、CやC++の仕様ではintより短い整数型は演算中は自動的にintに格上げされるから、
intが32ビット以上の環境なら単純に Out[i] = (in1[i]/2 + in2[i])/2; と書いてもオーバーフローしないよ。
これは Out[i] = (int)(in1[i]/2 + in2[i])/2; とまったく同じ挙動になる。
37 :
36 :2007/08/06(月) 23:17:48
コピペしたら /2 消し忘れた・・・orz 正しくは Out[i] = (in1[i] + in2[i])/2; と Out[i] = (int)(in1[i] + in2[i])/2; です。
>>36 それって仕様でなくて、処理系によるんでない?
てかシンプルなことなのに、やたら難しいことみたいにじれったいやりとりだなw
>>38 charやshortが被演算数になったときのintへの自動格上げはANSI Cの言語仕様だよ。
K&R第2版のA6.1節に書いてある。
自動作曲ソフトのようなものを作りたいです そこでまず何を勉強すればいいですか?
midi(笑)
音源Aが 波形x + 波形a 音源Bが 波形y + 波形a で構成されている時、 A - B = (x + a) - (y + a) = x - y でaを消す事が可能ですけど、逆にxとyを消してaだけで構成された音源を作る事は不可能ですよね?
変数が3つあって方程式が2つしかない場合、一般的に全ての変数は求まりません。
>>44 x と y が無相関なら、A, B の無相関化である程度の除去はできるかも。
x, y がそのままとりだせるかどうかは知らないけど。
歌がセンター定位である事を利用した カラオケ器 なんてのが趣味の工作で流行ったけど その逆にセンターの歌だけ取り出すのは まだまだ無理だよ。 リアルタイムに音声認識⇒音声合成をやらないといけないからね
>>47 それは、センターにボーカル以外の音も混ざってるからでは。
左右の音の、ボーカル以外の部分が完全に無相関なら
結構いいせんで分離できると思う。
まあ、「完全に無相関」なんて仮定が通じるわけもなく、
結局、ボーカル抽出は音声認識的な技術も使わないと無理くさい
ってことだと思う。
完全に無相関かどうかは、この場合関係ないでしょ。 L(x)+S(x) と R(x)+S(x)から、どうやってS(x)を分離するというのだい?
うん
相関ベースのブラインド信号処理でも、 2チャネルだと分離できるのは2信号までか。
歌声りっぷで同名ファイル選んで中央定位抽出できるけど FFTでなんとかかんとか
ノーマルバージョンからカラオケバージョンを減算すればいいんじゃね
歌声りっぷでググれって
誰もツールの話なんかしてねー
FFTでなんとかかんとか
離散フーリエ変換なんて糞
>>57 具体的に書かないと、ただの「自分に判らないものは糞ってことにしておきたい人」にしか見えませんよ。
A = a + x, B = b + x から得られるのは a - b, b - a しかないけれど、そのどちらかをFFTで何とか何とかすることにより、a + b の周波数が得られる。 あとは A + B = a + b + 2x = C, C - (a + b) = 2x, 2x / 2 = x で終了。
FFTを魔法の道具と思ってないかい? a+b +2*x から、 2*x をどうやって消せるの? それが出来るなら自動車の運転中の音声認識なんかに威力を発揮する大発明さ。 他にも、携帯電話で話者の声だけ取り出して送信するとか応用はすごいぞ。 大金持ちになれるチャンスだよ。 がんばれ
だから離散フーリエ変換なんて糞なんだよ。 アナログ回路最強。
DFT単体で考えてる人が多いな あれはツールなんであって、何かと組み合わせんとね で、到達方向が違うならビームフォーミングでいけるんちゃうの?と適当に言ってみる
>>62 ビームフォーミングって、分離の精度上げようと思うと、
>>51 あたりで言ってる相関ベースのブラインド信号処理になるんだけど、
マイク2本だと2音源までしか分離できないよ。
フーリエ変換でどうこうって言ってるのは、
a, b, x のそれぞれが、違う基本周波数のハーモニックトーンだとすると、
周波数領域でその倍音成分だけとれば分離できるかもって話かと。
>61 板違い >63 ぶっちゃけ出来ないけどな。 そりゃソース次第では出来るだろうけど、汎用は出来ない。
555 名前:名無しさん@そうだ選挙に行こう 投稿日:2005/09/11(日) 07:27:19 簡単そうに見えて簡単に出来ない事がある 1.CDをかけるとカラオケで再生してくれるプレイヤーってあるよね。 逆に歌手だけ抜き出すってのも簡単? 2.アナログ時代の電話線のエコーキャンセラーってあったよね?あれと同じで ビデオカメラにメカノイズが載るのはカメラ上に別のマイクつけて適応処理したら簡単に消せるよね? 3.最近3Dサウンドってあるよね。 2スピーカーなのにヘリコプターが立体的に飛び回って聞こえるよ。 だから、狭い間隔でおいた2スピーカーを広げて置いたように聞かせるのも簡単だよね 4.ホール効果とか残響のある部屋を再現する機能がついてるじゃん。 アレの逆でさ 残響の多い部屋から残響を消すのは、マイク付ければ簡単だろ? マイクで部屋の特性取りながら逆位相の信号を足せばいいだけだろ? --------------------------- 前スレにあった話の、この1の問題だね。 この4つとも、とても難しいのだけど、難しさを説明するのも難しい
ボーカルのみを消去するソフトがあったけど、出来はどんなもんだろ?
ヒロフのやつ?
>>55 FFTで中央定位抽出が一応出来る
どうやってるかはしらん
誰もツールの話なんかしてねー
定位が中央、右、左の3点だけって状態はまずない、ってので説明終わりにならない?
無理だろうな L(t) := A1*sin(w1t+C1)*D(r1*t,T1) + A0*sin(w0t+C0)*D(r0*t,T0) R(t) := A2*sin(w2t+C2)*D(r2*t,T2) + A0*sin(w0t+C0)*D(r0*t,T0) 関数Dはアタック+リリース みたいな単純モデルがタマタマあてはあまるなら別だろうけど
動的フィルタ使えば? このあいだAESとかいう学会で展示されてたのが単純な仕組みでなかなかの効果だったよ。
動的フィルタってどうゆうの?
えっ
>>73 Adaptive Filter のことかな。
入力によって、係数をどんどん更新していくようなタイプのフィルタ。
伝播路推定とか、音源推定に使えたりするんで、
それで、音源分離しようって話かも。
もちろん、入力信号の種類にまったく過程を置かない場合は
2マイクだと2信号までしか分離できないんだけど、
ある程度、信号が独立だとか、基底周波数が違うとかの条件があればいい線いくかも。
東京から大阪まで行きたいんだ ↓ 新幹線使うといいよ ↓ 電車ってのに乗るといいらしいよ そんな流れ…?
目的地は大阪じゃなく月だな
まあ、今の所不可能という点じゃ火星に有人飛行くらいじゃないかな
遠いお星に行きたいよ ↓ ロケット使えば何とかなるかもよ、でも難しい ↓ ちょっとそこで目をつぶって拝んでろ
そして79は星になった
2信号ってのは、f1(t) と f2(t) の2信号が L = L1 * f1(t) + L2 * f2(t) R = R1 * f1(t) + R2 * f2(t) という関係になって L1..R2が定数(畳み込み)なら分離出来るか というような問題 って事?
82 :
デフォルトの名無しさん :2007/08/20(月) 22:40:29
フーリエ変換ってものすごく簡単なことなんだろうけど、大學の教科書のわざわざアホみたいに難しい形に書いてる数式見たらやる気なくします(^^)
一応、理論自体はそれなりに難しいと思うがな。
理論をちゃんと理解できてる人の方が少ないと思う
あの難しい形の式も、数学の発展には大きく寄与してるのよ。 音響関係ではというか、工学系ではあんまり役に立たないけど、 理学系、特に数学科とかにいくとあれが必須。
直交変換(とその考え方)は工学系全般で役に立ちまくってるがな
>>86 ここの先生連中は正規直交基底については博士級の知識がある。
直交基底を用いた変換を理解しないで音プログラムは開発できないからな。
博士級(笑)
...を理解しないで音プログラムは開発できない? どんだけ狭い意味での音プログラムなのさ
直交(笑)座標変換
>>82 ミクシンスキー の演算子法 なんて読んでないなら読むといいかも
92 :
デフォルトの名無しさん :2007/08/21(火) 10:05:26
直交基底の説明ってなんで揃いも揃ってあんなに日本語が不自由なんですか。 国語能力に優れている人間だけが数学に関する書物を書けるようにする法律を作るべきだと思います。 あと、数学に非直観的でわけわからん記号を導入した人間や、人間の名前を法則につけた人間も死刑。 そして、心理学や人間工学の見地から数学記号のデザインを一新するべきですね。 あんなアリの這ったようなギリシャ文字は人類の負の遺産ですよ。
必要は発明の母と申しますが 改善点を見つけられた貴方は幸せですね。 直交基底の判り易い日本語説明をすれば、きっと大ヒット間違い無しですよ そして人間工学に基づいた数学記号のデザインを一新すればきっと神と崇められますよ。 これは発案者の貴方の権利であり義務ですから私たちは見てるだけしか出来ませんが 頑張って下さいね。
「オレが理解できないのはあんたの説明が悪いからだ!」と堂々と言うのは最近の風潮だねえ。 その図太さが羨ましくもある今日この頃… 日本語で書かれた理工学書の分け分からん度の高さには同意ですが、 己の意識改善も必要だと思いますよ。 金谷さんの本なんかは結構噛み砕いて書いてあるんで読んでみたらどう?
"最近の風潮"ではない。2chは当初からそういう風潮
96 :
デフォルトの名無しさん :2007/08/21(火) 12:20:04
内積・外積とか直交基底とか、ネーミングセンスゼロだな 大昔のオッサンが勝手に決めた不可解な和訳の用語をそのまま現代でも使っていいものか 異議を唱える者は居ないのか
>>96 そりゃ皆んなその言葉で考えたり仕事したりしてるからね。
新人は常に少数派だから、受け入れるのが普通。
圧力単位を急にパスカルに変えられても、水柱につい換算してしまうように、変更にはコストが伴うからね。
まあ、あなたが素晴らしい小学生でも高等概念が身に付くような総合入門書を作れば皆んな解決
素晴らしい小学生でも
99 :
デフォルトの名無しさん :2007/08/21(火) 13:16:39
クソネーミングをした大昔のオッサンは大罪人だな 後の人間のことを考えない自分勝手な考えでつけた名前のせいでみんなが迷惑している
あ、そのみんなってどこにいるの?
物理学において、最大の罪人は電流の向きを決めた香具師だと思うんだ。 もし逆にしておいてくれたら電子の流れと同じ向きになってどれだけ理解しやすかったことか。
それはそれで頭が固くならなくていいじゃない。 begin 〜 end を嫌う { 〜 } 派じゃあるまいし
if (...) end ...; begin って書いてあったら嫌だけどなぁ。
ほほう それはどういうコードかね
なんだこのスレ
摂氏は当初の様に0度を水の沸点とし、100度を水の凝固点にすべきだ!!!!11!!!!1!!
摂氏イラネ 1リットル=1キログラムとか、なんでもかんでも水中心て
博士級だかなんだか知らんが、数学や理論一辺倒の人ばっかりで 人の耳で聴く音を扱うソフトウェア書いてなさそう
理論のないサウンドプログラミングってどんなん? アナログ回帰?
アナログフィルタも理論バリバリじゃん
フーリエってどの学年で習うんでしょう? 高校?大学? 高校で、統計と確率を勉強しなかったのが悔やまれる。
今勉強すれば悔やまなくてもよくなるよ
高2だけどフーリエ習ったよ
理論はもちろん必要だけど、 感覚的なものを扱うのに理論一辺倒じゃろくなもん作れんってことですよ
>>114 失礼を承知で申し上げますが、そのまま逆にも同じことが言えます。
感覚的なものだけで音のプログラミングができれば皆さん苦労しません。
スレの主旨もアルゴリズムに関わる議論なはずですよね?
不毛な煽り合いはエネルギーの無駄な気がします。
音吉陽一を思い出した
なんかずれてるけどまあいいや
え?あっ! 俺のカツラずれてるのなんで分かった!?
面白くないよ
115が不毛といったとこで確信したよ
何を?
だからズラだよもう
あ、なるほどね
>>113 今はフーリエって高校で習うのか.....
ということは、内積・外積・直交基底なんかも高校で習てるってことか
ひょっとしてZ変換やマキシマムエントロピーメソッド(MEM)も優秀な工業高校なら教えてるのかな?
なら、ゆとり世代って、超すごないな
SoundEngine FreeっていうFreeのWave編集ソフトにある マスタリングプロセスCV制限ってどういった処理をしてるんでしょう ?
スレ違いじゃないか? 実際にどうゆう処理をしてるかは作者に聞かなきゃわからないだろうし。
どうでもいいけど、そのCV制限とやらのCVって何?
Constant Voltage(定流電圧)のことだろうなぁ
"定流電圧" に一致するページは見つかりませんでした。
定電圧 定電流
conは女性性器の俗称
132 :
デフォルトの名無しさん :2007/08/31(金) 19:36:44
ここはいつからツールのスレになったんだ?
Audacity
135 :
デフォルトの名無しさん :2007/08/31(金) 21:58:47
( ´∀`)ノ 16bitの音用濾波器の係数ってfloat,doubleのどちっがいいの? みんなはどっちつかてるの?
doubleのどちっ
FIRでもIIRでもフィルタの係数なら単精度 で十分 IIRの場合は帰還用メモリは倍精度が欲しいのと ただ、IIRの構成によっては (1-w) のようなのをそのまま持たせないなら wは単精度でも (1-w)は倍精度欲しい でも wのまま掛け算させたらいいと思うけどな
MP3をWAVに変換するデコーダを作ってるのですが、 ID3タグの情報をWAVのチャンクに収めたいと思います。 ID3を入れるチャンク名などは仕様で決まってるのでしょうか?
ああ、ここは「音楽」ではなく、ただの「音」のプログラムをするスレでしたか。 スレ違いすみませんでした。
仮にミュージックプログラミングだとすると、純粋に音芸的な話になったり、 あるいは自動で曲をつくttあrい
いやDTM板を教えてやりなよ
( ´∀`)ノ
>>138 非常感謝
あいやー、おら、doubleでしてたよ
別に全部doubleでも全然問題ないよ
( ´∀`)ノ
>>145 floatに比べでぶでのろまにならないの?
実測すれば済む事。 些細な事だ。
むしろVCなんかだと floatを勝手にDoubleに最適化しやがったりするしな
CPU的にdoubleの方が速けりゃその方がいいだろ
やってみればわかる事。 きっとメモリが少ない方が勝つよ
intel系CPUなら浮動小数点命令は確か80bitだし、 メモリへのアクセスもキャッシュ効くから、フィルタの係数程度なら目に見えての差は出ないと思われ。
だったらdoubleでいいや 実測しても全然かわらんかったというか コンパイラがdoubleにしやがるし
処がだ、SSE命令における浮動小数点ニモニックは64/32ビットしかないんだな。 でもって、超越関数を使わない限り基本的にはFPUなんて要らないから最近のコンパイラは 80ビットニモニックは殆ど使わなくなっていたりするわけで。 勿論、ベクタ化を期待するようなパフォーマンスを目的とするなら、2並列より4並列の方がずっと 速いからfloatで済むならそれに越したことはないし。 # ということで、簡単なサンプルで速い遅いと言っても無駄。
いや、そう主張するならそれでもいいけど 精度はやっぱり下がるしさ SSEの4並列を使うのは、コンパイラの最適化程度では期待できないでしょ というわけで、自分でアセンブリ書かない人はdoubleでいいお 自分でアセンブリ書いて完璧にSSEで最適化できて精度いらん人はfloatでいいじゃん
>>154 iccでもgccでも最適化でベクタ化できるけど?
>>155 ちゃんとコード全体をうまく並び替えてコンパイラが4列使い切っているかってことだろ
で、結局、人間がちゃんと4列使い切るような書き方をしてやらんと効率悪いってことだろ
まあ、普通はdoubleで何も問題ない floatでも特に問題はない で、精度が高いのはdouble
>>154 基本的に精度が何ビット必要かという視点の方が大事だと思うよ
16bit入力のFIRフィルタなら doubleはあきらかに無駄でしょ
>>158 んなことねーよ
作業中の演算精度が高くて少なくとも時間以外の損は無い
まあ、0から255までの結果しかいらないやつで わざわざintを使わず演算するやつもいないしな
結論 ・それぞれ好きにやれ
>>159 メモリサイズも当然違ってくるだろ。
あと、パソコン以外の環境にも移動させ易いのは大きなメリットだよ
逆に言えば、PC環境では全く問題ないってことだろそれ
確かに FADD命令 レイテンシ3、スループット1/サイクル FMUL命令 レイテンシ5、スループット1/2サイクル1,2 FDIV命令 レイテンシ-単精度17サイクル、倍精度36サイクル、拡張精度56サイクル 割算以外では単精度にしても早くならないね。
>153 お前の使ってるコンパイラが世の全てだと思ってるなら大間違い。 >157,>161でFAだな。
>>165 今がそうだとしても、過去そうでなかったし、
将来 単精度ならレイテンシが短くなるかもしれないし、
使ってるコンパイラが将来SSE命令をサポートするかもしれない。
何でも倍精度は楽かもしれないが、不必要に使うのはどうかと思う。
IIRならともかく、16bit入力16bit出力のFIRで倍精度にするメリットはまったくないのだから
>>167 将来doubleならレイテンシが短くなるかもしれない可能性もあるし、
将来も入出力が整数型16bitであり続ける保証も無いんだが?
今現在だって入出力形式でfloatはありうる。
未来の仮定の話をしたいのか、現状の話をしたいのかターゲットくらい絞れ。
単精度だ倍精度だと騒げるのが羨ましいよ。ホント贅沢な悩みだと思うよ MP3あたりだと16ビット、高級なもので24bit DSPの世界はまだそんなもの
>>171 >ほとんどのCでは、float型よりdouble型で計算した方が数倍高速になります
といいながら 基準にしてるのは SPARCだけ
SPARCは倍精度どころか128bit幅の浮動小数点演算器を持っているわけで
それを基準にするというのもどうかと思うよ。
ゲーム機や組込用のCPUのコンパイラの殆どは当然のように単精度が早い。
>ゲーム機や組込用のCPUのコンパイラの殆どは当然のように単精度が早い。 そもそも浮動小数点演算装置がなかったり(全部ソフト)倍精度はソフトとかそんなのばっかりだからね 倍精度がハードウェア実装されている今時のCPUだとメモリアクセスが律速になることはあるかもしれないけど double,floatどちらもそれほど速度に違いはでないよ。(int,double,floatの間を行ったり来たりするような型変換する方が単純な演算より遅いし) 結論としちゃ、自分が使いたいターゲットで使い易い型を使うってことでいいんじゃないの?
それでも IIRフィルタの遅延器は単精度では厳しいからなあ 計算方法を工夫すればある程度カバー出来るけど
( ´∀`)ノ 先生! IIRフィルタの遅延器って、なんで高い精度必要なんですか? 精度低いとどうなるのですか?
無限インパルス応答だから
フィードバック=計算誤差が累積 でもま普通は(要求がシビアでなけりゃ)単精度でも十分じゃない?
なんでもいいよ 場合によっては固定小数点数でも可
>>175 たとえばf0の低い 1次のLPF
y := y*(1-r) +x*r; とやると、rが小さいので(1-r)の精度が悪くなる
y := y +(x-y)*r; とやればソレは解決する。
1次の場合は、yが単精度でも単に誤差が累積するだけだけど
2次になると、yが単精度だとf0が低かったりQが高いとノイズが出てくる。
それも ピーとかいう類のノイズ
>171 この人こんな記事書いてたのか、ターゲット絞れないバカの典型だな。 用途や環境にあわせられない奴は最適化語るなよ・・・
>>180 あの本を書いた時点で既に、自称翁だ。バカだなんてとんでもない。年寄りは労われ。
多少配慮足らずでも、誰かの参考にはなる記事をネット上で公開してるんだし それをバカの典型と言い切れるやつよりは敬われる権利あるよ。
90年台に「floatよりdoubleの方が速い」とか嘘かかれても、参考にならないと思いまーすw ましてや「敬われる」とかありえませーんwww
floatよりdoubleの方が速いって言うのは、昔のプロセッサはfloatを内部で動的にdoubleに変換してたからだろ。 今はそういうのが無いからどう考えてもfloatの方が速いし、データが短い分キャッシュにも残りやすいから最適化も効き易い。
どうでもいい。結局処理系による。 つか180の食いつきかた見ry
うちのMacBook Pro (CoreDuo 2.0GHz) で試してみたけど、 floatよりdoubleのほうが速いぉ。
Mac(笑)
>>184 専用機はしらないけど、96年当時主流だったインテルもモトローラも内部80bitだよ。
内部で動的にdoubleに変換してる石って何?
>>179 2次でノイズが出るのは リミットサイクルって現象だろ?
なんかリミットサイクルの出ないフィルタとか論文があるけど、理解出来ないんだよな
>>188 内部80bitの場合も、floatよりdoubleの方がしばしば速い。
で、翁が想定しているのはSparcとx86だろ。
処理速度が問題になるほどのタップ数の多い FIRフィルタならキャッシュに収まるかどうかの方が 速度を決めてしまうと思うけどな 命令サイクルがギガに対してメモリは1桁下なんだから
( ´∀`)ノ
>>175-179 先生、有難うございました。
無限インパルス応答だからの回答に超感動しました。
精度が低いと、無限の過去の影響を細かく現代に反映できない。反映できないものは誤差として累積され、
現代を惑わす魍魎を生み出すことになる。怖いですね。
double が速いのはC言語の math.h が double に対してしか定義されていなかったり、 自動昇格が多数発生するためでしょ x87 の FPU は内部で 80bit に昇格するのがデフォだけど、それにしたって内部精度は命令を 発行して設定できるわけで、慎重に書かれたソースなら当時から float の方が速かったよ
今ならc99のお蔭でhypotf()なんかが使えるからねぇ。
今がどうだとか昔はどうだとかこのCPUではとかいつまでやってんだ?馬鹿馬鹿しい
( ´∀`)ノ 、先生 WindowsメッセージMM_WIM_DATA(録音バッファの録音完了)を受けての処理手順について何ですけど 下記の1,2のどちらが正しいですか? 1.waveInUnprepareHeader,waveInPrepareHeaderを用いる // 録音バッファの登録解除 waveInUnprepareHeader 録音データ、lpDataを処理する // 録音バッファの再登録 waveInPrepareHeader waveInAddBuffer 2.waveInUnprepareHeader,waveInPrepareHeaderを用いない 録音データ、lpDataを処理する // 録音バッファの再登録 waveInAddBuffer
>>200 さあ? どっちが正しいかはしらないけど 2でやってて不具合にあたった事はないな
( ´∀`)ノ
>>201 、先生、ども、ども、有難うございました。そっそうなんですか...
なんか、waveInもwaveOut処理同様に
>>200 の1.のようにするのが正しいのかなと思たですけど
それなんて3年峠?
どうして周波数が低いと大きな音を出すのに、高周波と比べて指数的に高いエネルギーが必要なの? 蝸牛が低音を捕らえようとするとどうしても指数的に音量が小さくなってしまうからなの? だったら低音は凄く耳に悪いね。難聴の原因だ。
動かす媒質の量
100人飛べる大縄跳びで二重飛びしようとするとものすごく大変なのと一緒・・・ではないな
>>207 マジレスありがとう。
1Hzで動く量と100Hzで動く量が違うのは当たり前ですね。
>206 真面目に低音は耳に悪いので注意。 スピーカー飛ばす原因も低音の出力が高すぎるってのが多いし。
スピーカーが飛ぶのは2つの現象 電力は 電流*電圧だけど、ボイスコイルは、コイルと名前が付くようにL成分を持ってるから 同じ電圧振幅でも電流は低周波程流れてしまう。 発熱は電流の2乗に比例するので、低音程 焼損し易い また、コントロールして同じV*Aを与えたとしても、ボイスコイルには質量があるから 同じV*Aを与えても振幅は低周波程大きくなる。 結果、大振幅で可動域を外れ物理的に変形してしまう。
213 :
デフォルトの名無しさん :2007/10/05(金) 21:15:13
waveOutOpenの引数にコールバックを指定した場合、waveOutProcはスレッドセーフっぽくないんですが。 なんか現在のスレッドの処理に割り込んで呼び出されませんか? WM_DONEで再びWaveOutWriteしようとするとかなりの割合でスタックが破壊されています。
手順が間違ってる
215 :
デフォルトの名無しさん :2007/10/06(土) 13:40:55
>>213 そういうもんだよ。
waveOutProcはスレッドセーフじゃないと、しっかり覚えておくといいんじゃない。
216 :
デフォルトの名無しさん :2007/10/07(日) 01:54:40
どこにもスレッドに関わることが書かれてなかったような気がするんですが、スレッドセーフではないんですね サウンド関連の生APIはむずかしいです
でもそんなの関係ねぇ
218 :
デフォルトの名無しさん :2007/10/07(日) 14:00:21
>>216 サウンド関連の生APIはむずかしいです
じゃなく
APIでプログラム作るのはとてもむずかしいです
が正しい。
極めてどうでもいい揚げ足取りだな
>>212 ブラウン管モニタを壊すにはデバイスドライバレベルでの制御が必要だけど
ひょっとすると、スピーカーはユーザープログラムで壊せてしまう可能性がある?
超低周波を出すとか、DCオフセットをかけ続けるとか。
ドライバレベルで保護してないかな。してなきゃまずいね。
ユーザープログラムも何も 曲作ってるときうっかり変な音を鳴らしてスピーカ飛ばすって時々あるもんじゃないの?
ない
俺もそんなに詳しいわけじゃないが、もちっとだけアナログの勉強をしてもいいと思うんだ。 スピーカーが飛ぶのは>212にあるようにスピーカーが想定以上の入力を受けた時。 なので出力波形だけでなく、アンプのパワーやボリュームによる所が大きい。
>>220 直流を通すオーディオアンプなんてほとんど存在しないだろ。
アンプにデジタルで直結したとしても、
普通はスピーカ出力の直前にコンデンサが入ってたりしてHPF特性がかかるから、
スピーカに超低周波や直流がかかることはない。
ああ、でも、直流そのものは通さないとしても、 ステップ関数とかガンと入れられたら階段部分はスピーカ的に結構きついかもな。
ステップ関数は階段部分ではなく、その後のフラットな部分がキツイわけで
フラットな部分はHPFで除去されるんじゃね?
229 :
デフォルトの名無しさん :2007/10/09(火) 22:05:52
インパルス連続攻撃で敵を倒せないですか?
http://proforceone.web.fc2.com/ ⇒ Processed input data
Chick+Corea[777]
Herbie+Hancock[999]
http://proforceone.web.fc2.com/ ⇒ Calculation processing
d=$.split("\n");for(j=0;d.length>j;j++){s=d[j].substring(0,l=d[j].indexOf("["));
s=encodeURIComponent(s).split("%2B").join("+");
n=d[j].substring(l+1,d[j].indexOf("]")).split(".");
n=eval(n[0].split(",").join(""));n=(n-n%20)/20+(n%20>0);br();
for(i=0;n>i;i++){write("http"+"://youtube.com/results?search_query=");
write(s+"&search_sort=video_date_uploaded&page="+(i+1));br();}}br();
>>227-228 カットオフ周波数10Hzの1次HPFの場合、
ステップ関数のフラット部分は時定数0.016秒であっという間に指数減衰するね
ageんなカス
ただのミスだと思うよ。 でもあなたの修正が間違っている
>>235 量子化ビット数が16だから3528000[bits]なら441000[bytes]だけれど、こう計算した方がわかりやすい。
44100[Hz] * 5[sec] = 220500[samples]
だから、#define BUFSIZE 220500 とすればいい。
238 :
デフォルトの名無しさん :2007/11/01(木) 04:02:20
リアルタイムのスペアナ表示を作りたい。 FFTしてlog(re*re+im*im)的なことをして振幅を対数軸にするのはok。 問題は、周波数軸を対数にしたいのだが、どうするべき? 低い方は補完なので適当にごまかすとして、高い方は間引いてしまうと情報が失われるのが いやなので避けたい。 好みとしては、ピンクノイズ(-3dB/oct)を入力したときに表示がフラットになりたい のだが(きっと聴感に近いので) 絶対値の和? 平均?
普通、Octave band pass filter bank をかけるかな。
>238 ロスしないってんなら最大使うとか。
>>238 前半、俺は、
たとえば5点あったら、その最大と最小と5個平均の3つを求めて
最大から最小への薄い垂直線を引いておいて
その上から平均を結んた線を引いてる。
こうやるとホワイトノイズでフラットになる。
ピンクノイズでフラットにするのは気持ち悪いように思うけど、
実現したいなら-3dB/Octの補正をかければいいのでは?
>>238 用途によると思うよ。
ピーク検出したいなら、ピクセルに対応するバンド内で最大値かな。
逆に荒く(1/6octとか1/3とか)で全体的な特性を見たいなら、両対数にしてからバンド内で
平均とか。ただその場合、各バンド内でデータのある周波数点に偏りが出る(バンド内で高域に
集まる)んで、平均した場合は必ずしもバンド中央の周波数での値にならないことに注意。
>>241 Windows Media Playerのバー表示がそんな仕様じゃなかったけか
>Octave band pass filter bank なるほど、FFT以外のやりかたもあるのね。検討してみます。 ピンクノイズは各オクターブ(とかの対数で等間隔の帯域)のエネルギーの密度が等しいと 何かで読んだので、正しく計算すれば自ずとフラットになるのではないかと思ったのです。 でもどう計算するとそうなるのかわからない。 logとる前の絶対値かその2乗を足すか平均するかしたあと√とる?
> ピンクノイズは各オクターブ(とかの対数で等間隔の帯域)のエネルギーの密度が等しいと > 何かで読んだので、正しく計算すれば自ずとフラットになるのではないかと思ったのです。 その考えで問題ないと思います。 こっちで実験したところ、ホワイトノイズのFFT値を1/3octで絶対値合計→フラット > logとる前の絶対値かその2乗を足すか平均するかしたあと√とる? バンド毎に log(sum(sqrt(re*re+im*im))) で大丈夫なはず。 DCTなら log(sum(abs(re)))
>こっちで実験したところ、ホワイトノイズのFFT値を1/3octで絶対値合計→フラット ピンクノイズの、だよね。 ありがとう〜
>>245 > ピンクノイズの、だよね。
いや、ホワイトノイズ
説明不足だったかも。すまん
フラットの意味によるんだけど、両対数軸上で直線って
意味なら
>>245 でホワイトでもピンクでもフラット。
直線かつ水平って意味なら
>>245 ではホワイトのみフラット。
直線かつ水平のつもりでした。>フラット
あいまいな言葉を使ってごめんね。
> 直線かつ水平って意味なら
>>245 ではホワイトのみフラット。
高域にいくにしたがって加算する数が増えるからホワイトノイズは右上がりに
なりませんか?
↑からさらに自分で考えてみた。
>>244 log(sum(sqrt(re*re+im*im)))
の方式で仮に1バンド=1octで出力することを考える。
1個上のバンドに行くに従って加算するデータ数が2倍になっていくわけだから、
結果は+6dB/octの右上がりになるはず。
問題は、ホワイトノイズを入れると+3dB/octの右上がりになってほしい。
sqrtとsumの順番を入れ替えると(sqrtを消して20→10でも等価)、
数が2倍になると3dB上がるので+3dB/octになる。
つまり、20*log10(sqrt(sum(re*re+im*im)))
最初に書いた、絶対値の2乗で足して平方根をとる、でいいみたい。
ピンクノイズの各バンドの平均値は1バンド上がると-3dBずつ下がっていくはず
つまり1/√2に減っていくはずで、これの2乗の次元(1/2ずつ減ってく)で
数が2倍になっていくものを合計していくと皆同じになるという理屈。
ちなみに、素直に(?)、ホワイトで水平、ピンクで右下がりにするには、
sumのところを平均にすればいいはず。
(1バンド上がるごとに2倍になる個数で割ったやつをsqrtするので、1バンド上がると
1/√2つまり-3dBさがっていく)
root mean squareってやつですね。
あ〜すっきりした。
>>249 > 1個上のバンドに行くに従って加算するデータ数が2倍になっていくわけだから、
> 結果は+6dB/octの右上がりになるはず。
データ数が増えてもデータ値は高域に従って指数的に減っていくので、
よほど高域強調されてない限り合計しても右上がりにはなりません。
>>249 > sqrtとsumの順番を入れ替えると
平方根の合計と合計の平方根は別のものなので入れ替えられません。
平方根の合計 sqrt(1)+sqrt(2) = 1 + 2 = 3
合計の平方根 sqrt(1 + 2) = sqrt(3) = 1.732...
素直に 20log10(sum(sqrt(re*re+im*im))) で各バンド計算して
+3dB/oct補正掛けた方が実装の見通しも良くなるような。
まちがえた、20log10(ave(sqrt(re*re+im*im)))です。 あとsqrt(re*re+im*im)の部分は複素数の絶対値計算なので、 RMS以前のデータ準備の段階。|z|^2=re*re+im*im RMSやりたいなら、|z|=sqrt(re*re+im*im)の各値の二乗平均平方根、 つまりsqrt(ave(|z|^2)) = sqrt(ave(re*re+im*im))にしないと変なことになる。
> データ数が増えてもデータ値は高域に従って指数的に減っていくので、
> よほど高域強調されてない限り合計しても右上がりにはなりません。
なんか根本的な勘違い? >自分
ホワイトノイズはデータ値が(確率的には)全部等しいと思ってたのですが?
> 平方根の合計と合計の平方根は別のものなので入れ替えられません。
もちろんそうです。計算方法を変えるという意味です。
> あとsqrt(re*re+im*im)の部分は複素数の絶対値計算なので、
> RMS以前のデータ準備の段階。|z|^2=re*re+im*im
> RMSやりたいなら、|z|=sqrt(re*re+im*im)の各値の二乗平均平方根、
> つまりsqrt(ave(|z|^2)) = sqrt(ave(re*re+im*im))にしないと変なことになる。
>>249 でRMSといってるのは、 20*log10(sqrt(sum(re*re+im*im))) のsumを平均に
変えたもののことで、あなたの式と同じです。
254 :
デフォルトの名無しさん :2007/11/10(土) 11:42:09
CD-TEXT の規格か仕様か、これを読み込むサンプルのあるサイトか分かりませんか。 ぐぐる用語でも分かると助かります。お願いします。
256 :
254 :2007/11/10(土) 22:29:04
>>255 有難うございます。お陰で参考になりそうなのを1つ見つけました。
英語版で 1996/12月ソニーが配布したものですが、データ構造についても
書いてあるようです。
余談ながら、ソニーは普及させたかったような雰囲気。
添付のソフト(3本)用に VB4 runtime routine が付いている。
257 :
すみません素人です :2007/11/20(火) 11:00:15
最近卒研でDSK使って音声処理する実験始めたんですけど、 高周波や低周波だけカットするLPFやHPFのプログラム(C言語)を組んだんですが、 逆に高周波とか低周波だけ増幅させるプログラムって書けるんでしょうか。 本やネットではちょっとわからなかったので、式とかサイトとか知ってる人がいたらどうかお願いします。
カットしたのを元のに足す引く
>>258 さんの通り、
高周波だけをカットした結果を元の信号に(遅延・位相を合わせて)足せば低周波だけ増幅出来るわけだけど
どうして、普通はカットしか書かないのかというと、
ゲインが1を超えると、固定小数点演算だとオーバーフローするし
そもそも出力DACのレンジを越えてしまうと歪ませるしかなくなるからさ。
>>257 増幅したいところ以外をカットして全体のゲインを上げる
あとは双二次で検索
まあ、あと、増幅は、ノイズまで増幅しちゃうしね。
262 :
257 :2007/11/20(火) 15:41:55
なるほど、カットするプログラムを応用するんですね!どうりでみつからないわけです… それではオーバーフローやノイズの問題も考えつつ取り組んでみたいと思います。 皆さん、丁寧なご回答ありがとうございました。
カットして増幅とか、カットしたのをもとに足す引くとかでなくて、 ローシェルビング、ハイシェルビングフィルタでしょ。 双二次にはちがいないけど。 いわゆるトーンコントロールのロー・ハイで一般的なやつね。 ブーストするんだから、振幅に気をつけなきゃいけないのは当然
>>264 まぁこのあたりは言い方の問題も結構あって、カットって言った場合に
シェルビングEQによるカットなのか、ハイパス・ローパスによるカットなのか、
ここまでのレスでもみんなバラバラの前提で喋ってたりするからねぇ。
カットして増幅しても、ただ増幅しても、相対的なゲインカーブが同じなら同じで良いと思う。
(アナログだとレベルによる非線形性がからむんで違うって話になるけど)
ハイパス・ローパスでカットして増幅する場合は、
例えばハイパスの場合カットオフ以上が-6dB/octとかの傾きで一様に減衰していく。
対してローシェルビングで持ち上げる(orハイシェルビングで落とす)方法だと、
ある時点で減衰/増幅が頭打ちになるって違いがある。
チラ裏失礼
>高周波とか低周波だけ増幅させる カットした結果と元信号の足し引きみたいなのは、位相や遅延を考慮しないといけないから 普通わざわざやらないよね?
でも、数式を良く見ればf0が同じなら分母は固定で、分子だけが違う。 で、分子の変数は3つなので、 HPF/LPF/BPFの3つの組み合わせで何でも作れる事になる ただ、ピーク位置が違うので多少f0は調整しなければいけない。
HPFとBPFはLPFの組み合わせで作れるんじゃね
実は2次の同じf0の HPF+LPF+BPF を加算すると理論的にはフラットになる もっとも、計算精度が有限だからノイズは出るけどね。 だから1-HPF は LPFではなくて LPF+BPFになる。 その場合の特性は -6dB/Octではなくもっと悪い(1次の特性に近い)
それシェルビング1っ個やるのよりメリットあんの?
特性を可変したい場合は実際に分割するけど(可変出来るのは特性の上下だけでf0は無理だけど) 固定なら単にIIR計算としては1個でやるよ? 係数を足し算するだけだし
3つのフィルタの係数を gH*HPF + gM*BPF + gL*LPF として、gH,gM,gL を調整すれば、イコライザの特性が出せる 分母は共通だから分子の係数を加算すればいい。 左右を上下させる場合、 gMは gH,gLの加重平均 gM = √(gH*gL) 程度がイーカンジ バンドを調整する場合、綺麗にポコンと上下させるにはQも調整しないと 上下非対称に
言葉で動作原理を述べるのは簡単だが、それをプログラムで作るのが分からない。
やっぱり、HPF+BPF+LPFの合成だね。 BPFは加重平均だ。 公式を見るだけじゃなくて原理が判ると多少楽しいよね。
>やっぱり、HPF+BPF+LPFの合成だね。 どーしてそうなる? HPF+BPF+LPFの合成だと4次以上にならないか?
>>274 それが263とかがいってる双二次フィルタですよ。
先人の知恵どころか、いま話に出てるEQなどでいちばん一般的な方法かな。
わざわざフィルタ合成みたいな概念でやるなんて聞いたことないなあ。
>>276 合成じゃなくてフィルタ出力の加算のことを言ってるんじゃない?
lpf(bpf(hpf(x))) じゃなくて lpf(x)+bpf(x)+hpf(x) (式は適当)
普通合成っていうと前者だから
>>275 はかなり紛らわしいけど。
根本的なことを聞きますが、LPFを作成する場合、 ・FIRフィルタを用いる(入力信号に対し、フィルタ係数を畳み込み計算することで 低域通過させた出力信号を直接求める) ・FFTを利用する(入力を一旦FFTし、通過させる帯域のみを保持し、 他はゼロ埋めさせたスペクトラムを逆FFTすることで出力信号を得る) この2通りのやり方は理想的には全く同じ挙動になるのですか? 今までFIRを使ったやり方が原理的に良く分からなかったので、FFTを使ったLPFを 作成していたのですが(周波数帯域の通過が直感的によく分かるので)、 最近勉強しなおしてFIRフィルタについて学んだところ、 時間領域において計算するだけでそのまま出力信号が得られるのが 非常に不思議に感じ、質問させていただきました。
FFTのことも良く分かってないんじゃないの
何度もすみません。追記です。 もしそうであれば、両者の特徴として FIRの方が処理速度が速いが、後者の方が精度が高い(遷移周波数帯域幅が狭い)結果が得られる という認識であってますか?
FIRフィルタをFFTで高速計算させる事が出来るけど それをやってるなら、そういう事は書かない筈だけどな FFTでフィルタを作った場合、バッチ処理でやるかブロックで処理する事になる。 ブロックで処理するとブロック同士がつながらない問題が出てくると思うのだが・・・・
>>279 時間領域における入力信号とFIR係数列の畳み込み演算は、
周波数領域におけるFFTされた入力信号とFFTされたFIR係数列の各項乗算に対応する。
つまり時間領域でのFIRフィルタ係数をFFTしたのが周波数領域でのフィルタ特性。
> FIRの方が処理速度が速いが、後者の方が精度が高い(遷移周波数帯域幅が狭い)結果が得られる
FIRはn^2 FFTはnlognなのでFFTの方が速い。
周波数領域での直接設計なら遷移周波数帯域幅も何もスパっと切れるけど、
実際にはあんまり急峻に切ると時間領域のFIR係数の収束が悪くなって(要するに
Sincに近づく)、逆に打ち切り誤差が出やすくなったりして、そう簡単にはいかない。
>>283 MP3でやってるように1/2 づつ窓関数をかけてズラシテフィルタをかけた後で合成すれば誤魔化せる
という事なんだけどうけど、やっぱり低い周波数にひずみが出るけどなあ
「ズラシテ」フィルタってなんだろと思ったのは漏れだけでいい。
>>285 ヒント: Time Domain Alias Cancellation (TDAC)
ズラシテフィルタ=comb filter
こういう事だろ? たとえばFFTのサイズを4096としたら 1024毎に分けて、1ブロック毎に、 2ブロックを取ってくる。 それに窓関数をかけるけど、このときに (1-cos)/2 みたいな 1ブロック分ズレたものと加算するとフラットになるような窓関数を使う。 で、これにFFTをかけてフィルタをかけて、逆FFTして、1ブロック前の分と加算して出力してゆく。 問題は、フィルタをかけて戻した結果が、はじめと終わりがキチンと0になって戻ってればいいけど そうじゃないとこれがノイズになる。 だから再度窓関数をかけられるように 最初にかける 窓関数を √(1-cos)/2 つまり半角公式でsinになるわけだけど これを2度かけると確かに戻るけど、窓関数としての性能がだいぶ悪くなる
>>290 短時間FFTだね。2回掛ける方法の場合、有名どころがsin窓とかVorbis窓。
でも、FFTサイズ4096なのになんで1024ずらしで使ってるの?
2048ずらしで十分だと思うけど
MDCTで使われるTDACは、処理ブロックを重ね合わせるまで同じだけど、最初の段階で、
重ね合わせた部分でプリエコー・ポストエコーが最終的に相殺されるように処理するのが違う。
あ、あと、窓関数の性能が悪いっていってるけど、 目的に合わせたトレードオフだから、一概に良い悪いは言えないと思われ 周波数分解能なら矩形窓最強ってことになる。
音響レンズのシミュレーションをしてみようと思うのですが どこから手を付けていいのやらわかりません
いまの話では用途が解析じゃないから、矩形窓はありえないでしょうけど
用途以前にまず何の性能か言わないと意味無い
AGC、オート・ゲイン・コントローラが必要で、Waves MaxxVolumeは高くて 買えないため自作(VSTでもオフラインでも)しようかと思うんですが、 原理としては固定ゲイン+超長アタック/リリース(10秒〜)の 先読みリミッタという理解で正しいでしょうか?
AGCってけっこう大雑把な呼び名で、 単にゲインアップ+リミッターだったり、RMSコンプ+リミッターだったり、 もっと別のアイデアが入っていたり、、、いろいろのような 思うように作ったらいいんでは。 ある程度まともなの作るなら先読み(リアルタイムなら出力の遅れだけど)は必要だろね。 ま、フリーのコンプやリミッターもいろいろあるけどねえ。
どこで質問すればいいか分からなかったので、ここで質問させてください。 フーリエ変換の本を読んで、自分もWAVEファイルを読み込んで試してみたいと思ったのですが、 肝心のプログラミングがさっぱり分かりません。 Turbo C++でやろうと思っているのですが、WAVEファイルの読み込み方も、読み込んだデータの処理の仕方も 実際にFFTを行う方法も全然分かりません。 C++自体の使い方は基本的な命令文は知っていますが、マルチメディア関連はやったことがないです。 実際のプログラミングの仕方や、参考になる本など教えていただけたら幸いです。
あきらめたら?
300 :
298 :2007/11/27(火) 02:06:25
ありがとうございました。もうあきらめます。
waveの読み込みぐらいgoogleに聞いてみればいいのに
釣りだろ? jk
>>297 TDの最後で、全体の音量をオートメーションで調整していくのが面倒、
というのがあって、楽したいなぁと思いまして。
とりあえず先読みリミッタ式で作ってみたところ、やはりレベルの急な変化にはついて
いけないことが多いですね。かといってアタックを短くすると数秒のポンプになりますし。
大雑把に手動調整、細かいところは自動調整って形で運用してみます。
ありがとうございました。
もしかしてみなさんはFIRだのFFTだのと言った物は既成の物があってそれを利用しているのでしょうか?
>>305 定番もののソースはどこにでも転がってる。流用してるやつもいるだろうよ。
パソコンの場合、転がってるのを使ってもいいし、自作しても何倍も速度が違わない DSPなんかの場合、メータが必死ならFFTのライブラリなんかも公開してくれる そうでないと当然、自分で作りこまないといけない。
理系じゃない高校生ぐらいの数学知識でフーリエの冒険読んでみて5日くらいでFFT書けたよ。 多少あやふやなとこもあったけど。 ただしゲーム作れる程度のC言語の知識はあった。 実際にやってみて詰まったところ質問しないと意味ないよ。
社会人になってだんだん時間なくなって、ライブラリ探すところから 始めるようになった。どうしても無かったり、仕様がゴミだったら自分で書くけどね。 目的が、使いたい機能を最小の手間で作る(で、使う)、になってるからなぁ。
>>308 先生
そのFFTソースを開示してください
ついでに chirp-Z transformも作ってください
単にFFTを使いたいだけだったら(プログラム作成が目的でないのなら) Scilab か GNU Octave を使ったら? FFT機能は標準装備だし、確かWAVファイルの読み書きも出来たはず。
まそれいっちゃうと他にも選択肢はたくさんあるけどな。 Mac OSなんかはSIMD使ってアクセラレートされたFFTライブラリが標準で提供されてたな。
FFT(笑)
308じゃないが、だいぶ昔に書いたFFTのコードとサンプルアプリをようやっと発掘してきたが・・・そういう空気じゃないなw
FFTのライブラリって結構いっぱいあるけど 定番とかオススメってある?
定番は自作。 オススメも自作。 FFTそのものは20行もあれば書ける。 ビット逆順とか入れても40行。 面倒だったり頭を悩ませるのはソコじゃない。
完全自作にこしたとはないけれど、 十分な完成度というか性能というか(速度面とか)出すとこまで含めると、 それなりに時間と労力いるよね? そこまでコミットできないし、結果が得られれば良いヘタレな俺は やっぱりライブラリ活用でし・・・ (でもそのためのライブラリ
コード見れば判るだろうけど、 FFTそのものの速度はチューニングしてもしなくても2倍も違わない。 というかチューニング出来る要素はそんなにない。 仮に2倍違ったとしても、パソコンの場合、それでどうしたのって程度の差でしかない。 リンク先のように最大の素数を求めてるとかならともかくさ
SIMD化するだけで数倍速くなるよ。 ただ、PC上での話なら5年前のCPUですら素のサンプルをそのまま使っても十分な性能出てたけどね。
Delphi使いがこのスレにたまにいるようだけど、Delphiでサウンドプログラミングなんて邪道だろ
ナンセンス 好きなの使えばいいじゃないの
FFTで何をするか、に興味がある FFT実装には興味ないなぁ
Playerでグラフィックイコライザみたいな 棒グラフがぐにゃぐにゃ動く画面は リアルタイムにFFTしながら描画してるのでしょうか?
そうですけど
MP3の場合、FFTというかある程度の周波数情報は復調時に得られるのかも あと、グライコそのものはFFTでやるより、バンドパスや同調(Q無限大の)フィルタでも負荷量は バンド数によっては小さい。
きっちりと理論の実装をするのが得意なやつもいれば、 理論はそこそこ、それらを利用したアプリケーションとか書くのが得意なやつもいるよな。 あんがい両方に長けてるやつって少なかったり
糞文系が理系を支配する構図ってやつ
>>326 低域で精度を得ようとするとタップ数が増えるからFFTというかFIR系はつらいね…
グライコならフィルタした音聴くわけじゃないし、パワーだけ得られればいいから
位相回りまくってもIIR系で急峻に落とす方が計算量としては少なそう
>>327 正しい分業の姿ですな
>328 327は本来両方とも理系の担当分野だと思うけどな。 つか文系は基本的にある程度以上の国家資格持ってるのならともかく大半は高卒の方がマシな連中だからな。
文理ではなく理学と工学の関係に近いかな
学の無い人は壁を作りたがる
理系は文系をカバー可能だが 文系で理系をカバーできないやつは使い物にならない しかしそういうのに限って 他人だまして金儲けるのだけはうまかったりする でスレ違いな訳だが
理系でも文系でもいいけど こんなところでストレスぶちまけないでよw
335 :
デフォルトの名無しさん :2007/12/02(日) 15:29:45
社会を支配しているのって文系の奴ら何だからね。
FFTSSってのがあるな 暫くこれ使わせてもらおう
大浦氏のCのやつをラッパークラス書いてC++で使ってる
グライコならラジオの原理で言う、超再生方式が比較的効率がいいよ 表示だけなんだから処理時間が足りないなら間欠的にやればいいわけだし
IIRのバンドパスとかとはどうちがうの? (グライコって、スペアナでしょ
ああ、スペアナだな。 みんながグライコって書いてたから勘違いしちゃった。 IIRでいえばバンドパスではなくて分子が1でQが無限大のLPF つまり、サイン波ジェネレータに使う構成があるでしょ? 分子が1だから掛け算の回数がそれだけ少なくなる。 バンド幅は検出時間で調整する。 つまり低周波程周期に比例して長くする。
ただ、間欠的にデータ取るから窓関数は必要。だからそれも足したらバンドパスと変わらないけど 間欠的にデータが取れるから処理時間が余った時だけとかの調整が可能なのが有利。 バンドパスでも間欠的にデータ取れるけど、その場合だって結局窓関数かけないといけないから。
バンドパス 窓とかかけないでも、低いほうの周波数帯だったら 1サンプル飛ばしでsr半分として、2サンプル飛ばしでsr1/3として、みたいなかんじで 計算すりゃよくない? あくまで精度は重要でなくて、少しでも軽く処理したいって前提だけど
あぁでもエイリアスひろっちゃうかな、、
b0 + b1*z^-1 + b2*z^-2 ------------------------ a0 + a1*z^-1 + a2*z^-2 BPFの分母は b0=-b2,b1=0 か b0=-b1,b2=0(こっちは特性が悪いから普通は使わない) だから計算量が b0=1, b1=b2=0 に比べて極端に悪いとは思えない
マルチバンドコンプ用に帯域分割フィルタを作りたいんだけど、 線形位相・完全再構成な不等分割フィルタバンクの設計法を調べるので方向性合ってる?
346 :
デフォルトの名無しさん :2007/12/09(日) 02:29:32
348 :
デフォルトの名無しさん :2007/12/09(日) 11:36:04
>>336 FFTSSはライセンスがGPLじゃないんだね。
上記の著作権情報をソース/バイナリどちらであっても
含めないといけないとあります。
ダウンロードに名前とemailと目的まで入力か...
>>346 ども。参考にするよ。FFTとかFIRの仕組み自体の実装には興味ないんだけど、
設計法は勉強したいと思ってて、そのあたりは結局のところ自分で作らないと
勉強にならないから自分でやるよ。
ちなみに、車輪の再発明って物事の実現効率しか見てなくて、
逆に学習とか、車輪の再発明そのものが必要になる場面もあったりする。
ツッコミいれるときはその意図に注意した方がいいかも。
(今回はそのあたりの前提を言ってなかったんですまんかった)
学習目的のそれは、再「発明」とは違うんじゃないかな。 再開発とか再実装あたりが適切じゃないかと思う。 既存の発明の情報を得て、理解した上で実際にやってみるって作業でしょ。 再発明ってのは、まだどこにも存在してないと思い込んで、既存の発明を参考にせずに一から自分で作る話。 実装とか設計以前の着想とか発案から始めて、先人達がとっくに解決したような問題で延々悩むことになる。 まず調べろ、ってこと。
>>350 車輪の再発明、ってのは単に言い回しでそうなっているだけで、
最初から
>>350 の言う厳密な発明よりも広い、開発をも含む意味で使われてるよ。
ほぼ同じ文脈で使われるNot Invented Here症候群(自前開発以外を採用しない)の場合も、
厳密な発明って意味の他に開発の意味も含むし。
とりあえず、バタワースあたりの振幅特性だけもってくる直接設計法で
一番上のバンドで誤差吸収ってのを考えた。
352 :
デフォルトの名無しさん :2007/12/09(日) 20:43:06
>> 345 CiNii - 線形位相完全再構成不等分割フィルタバンクの設計 CiNii - 線形位相完全再構成不等分割FIRフィルタバンクの設計 論文みたいだね。やくにはたちそう:)
>>352 ありがとー! 論文は読み慣れてる(分野違うけど工学系)んで問題ないです。
FIRの方をざっくり読んだけど、他の方法で漸近的に設計しておいて
最後の1or2バンドで補償してる感じかな……。
354 :
デフォルトの名無しさん :2007/12/28(金) 04:01:10
355 :
デフォルトの名無しさん :2007/12/28(金) 04:03:00
すまん自己解決 (問題-18) 音響レンズとは何か。 どんな機能を果たしているのか。 どんな材質で出来ているのか。どのような特性があるのか。 -------------------------------------------------------------------------------- (解答-18) 音響レンズとは探触子の圧電素子より前面に配置してある構造体で、音波を収束させる目的を持つ。 生体での音速に比べ遅い音速約1000m/secのシリコンで出来ている。 凸面形状をとることにより探触子から出た超音波を収束させることが出来る。 もし、音響レンズに生体より早い音速を持つ物質を使用した場合は 凹面形状をとらないと探触子から出た超音波を収束させることが出来ない。
DSPの経験が全くないのですが、2nd order Butterworth lowpass filterの、カットオフ周波数(1)での、ある周波数(2)の入力の位相の変化ってどうやったら求められますか? ディレイのフィードバックで発振させて、フィルター入れたらピッチが変わって音痴になってしまいました。位相ズレ分のディレイを補正したいんです
普通はZ変換にw*i を突っ込めば出ますが? でもディレイ入れるだけでピッチが変わるって・・・・何かその前にお間違えでは?
サウンドプログラミングって面白いね!
PCM出力用のバッファからリアルタイムでスペクトルを取得する為に 自分でコーディングしたFFTに short(signed 2bytes) 要素数65536 を処理させたんですが、 頑張っても 0.22 秒ほど掛かってしまうようです。 車輪の再発明をするのもあれなので、「FFTをするなら普通はこれを使う」といった手段、 例えばもっと高速に動作する既成dllやライブラリなどは無いでしょうか?
速度を求めるならfftw 俺は呼び出しの簡単さ優先なんで大浦氏のFFTライブラリ (それでも自分で書くよりも断然速い)
fftwなら、MKLにも同梱されているしちょっとした修正でCUFFTにも移植可能だし、 使っている人が多いと言うのも魅力だね。後は、2の冪に縛られずに済むのも手抜きにはいい。
>>359 整数ではなく浮動小数点でデータを与えた方が変換時間が短いと思う
もっと少ないサイズでやるなら固定小数点も考えられるけど、2^16個では固定小数点では無理
あと、そもそも1秒分以上のサンプリングデータを0.22秒で処理出来ているのだから十分高速だと思うよ。
スペクトル表示が目的なら 4096か8192点で十分でしょ。
>>359 SINのテーブルや、ビット反転アドレスなんかのテーブルは事前に作ってるんだよね?
これを毎回作ったり、sinを毎回計算させてたら遅いよ
>359 この手の最適化話するならマシンスペックと施した最適化くらいは書いとけ、といつも思う。
>>363 >これを毎回作ったり、sinを毎回計算させてたら遅いよ
CUDAなら毎回計算した方が早い罠。
OpenALを使って3Dサウンドをやってみたいのですがググって見ても断片的なblogの記事くらいしか 日本語資料が見つかりません どなたか日本語の各種ドキュメント、書籍等をご存じの方がおりましたら教えていただけると助かります よろしくお願いします
義務教育受けてないなら諦めろ 受けてるならなんとかなる
ジュニアハイスクールレベルの英語教養を舐めるなよ
大丈夫、いみじくも「ジュニアハイスクール」と呼ばれるところに行っている生徒程度の英語教養があるなら。
フェーズメータを作成しようと思うのですが、知識が無くて 困っています。参考文献や参考になるサイトがあったら教えてください。
フェーズメータって事は、サイン波オシレータと そのオシレータとの位相差を表示したいって事? それをどういう環境で作りたいの? パソコンの場合、ディレイがハード毎に違うし、そもそも出力と入力が同じサンプルクロックとは限らないから 2CH 入力して 出力を L/Rのどっちかの端子から入力させて位相を比較するとかじゃないと 汎用性が無いだろうな 位相の測定は出力オシレータを90度位相差が出る sin/cosのベクトル積型にしておいて sin/cos成分との掛け算で出すのが一番簡単だと思うよ
>>372 ありがとうございます。
"sin/cosのベクトル積型"というのはどういう
事なのでしょうか。すみません馬鹿で。
ベクトル積じゃなくて回転行列との掛け算だろう | c , s | |-s , c |
376 :
デフォルトの名無しさん :2008/01/25(金) 01:10:48
( ゚д゚)ノ ハイ!シツモンデス!
文書では上手く説明できないと思ったので、グラフ描きました。
http://www-2ch.net:8080/up/download/1201189698030081.7mcqr5 デジタルオーディオのミキシング用に、IIRフィルタを掛けて目標の周波数帯域を取り出そうとしています。
また、リアルタイムに取得する周波数帯を変更していく予定です。
そこで、まずはsin波形で色々と試しているところなのですが、
現象の呼び名が分からないので検索できませんでした。
グラフを見て頂いて、問題箇所を確認してもらえるでしょうか。
@ IIRフィルタを掛けた場合、波形が後方へズレる?と思いますが、これは正しい現象ですよね?
その場合、ズレ幅はなんと呼ばれるのでしょうか?
また、その幅をIIRの係数か何かから事前算出できるものなのでしょうか?
A また@のズレ幅ですが、周波数によって変わると思うのですが、これは正しい現象でしょうか?
B フィルタの開始、終了時に不安定?になる区間があると思いますが、これを排除する事は可能でしょうか?
また、区間の長さを事前算出できるものなのでしょうか?
C グラフにはありませんが、IIRフィルタの係数を徐々に変更した場合、
例えば low-pass の通過帯域を 100hz → 1サンプルづつに+1 → 1000hz と変更し、
リアルタイムに取得帯域を変更した場合、正しく計算できるものなのでしょうか?
宜しくお願いします。
位相という言葉すら知らずにいきなりデジタルフィルタに手を出す時代なのね・・・
馬鹿は際限無く馬鹿ということ
379 :
デフォルトの名無しさん :2008/01/25(金) 03:25:54
>>378 とりあえず、位相と窓関数とRBJAudioEQCookBookとピーキングフィルタとウェーブレット
を愚ぐれ。
しかし位相も知らずにIIRとかどうやって知ったんだろ...。
>>376 IIRフィルタに限らずデジタルフィルタは Z変換して、そこにe^(iw) をぶち込むと
周波数特性が出ます。
周波数特性は、 複素数の絶対値がゲインで、複素数の角度が位相です。
だから、貴方がやるべきことは、Z変換を理解する事です。
それには複素数を知らなければいけませんし、
そのついでにラプラス変換とフーリエ変換も勉強しないといけません。
その後でしたら説明出来ますが、今は説明が難しいです。
なお、最後の質問は、Z変換を理解した段階でも、まだ答えるのは難しい問題です。 実用的には十分ゆっくり変更するなら大丈夫ですけどね
383 :
376 :2008/01/25(金) 22:19:20
>>377 >>379 SCILAB使ってます。便利な世の中です。
>>381 とりあえずz変換を勉強中です。
今のところ、離散時間信号から複素数平面への写像と捉えてます。
まだ複素数平面状で何ができるのか勉強不足なので、相違のズレが(言葉遣いあってます?
なぜ発生するかは理解してませんが。
>>382 リアルタイムにグリグリできるパラメトリックイコライザっぽいものを
作ろうと思ってるんですが、もしかして使う手法を間違ってます?
>>378 罵倒するのはいいけど、せめて1単語でもヒント書いてよ
でないと、オレと同階層の住人。
>>381 相違のズレ>位相のズレ
“そうい”ってなんだよオレ...orz
まあ、なんだ。せっかくのスレなんだしギスギスしないでも...
>>376 キーワードは「直線位相」だ。
>>383 プログラミングの現実的な側面から言うと、
4)1サンプル毎に変化させるような仕様は事実上不必要かと
本当に1サンプルの時間精度で制御したいなら別だけど。
実際問題として、たとえばVST plug-inならDAWによるが
数千〜数万サンプル単位で波形データが渡される。
# 丸数字はやめて……
オフライン処理なら意味のある仕様かな。
その場合は1ステップ毎に係数書き換えで済むような気がする
キーワードとしては、後は群遅延とかかなぁ。
388 :
デフォルトの名無しさん :2008/01/26(土) 03:37:28
>>383 パライコっぽいってことはパライコとは微妙に違うの?
1サンプルごとになぜ係数を変えるの?
単にパライコなら379に書いてあるように、RBJAudioEQCookBookの係数を使って
複数のピーキングフィルタを実装してつなげればできるけど。
>>383 Z変換して複素数を突っ込めば、位相のズレが起きるのは当然と判る
位相のズレを起きないようにするには、虚数成分がゼロにならなければならない。
それには、分母が(1+aZ+...)なんてなってると分子が同じ係数、つまりフィルター
でない状態でなければ無理。
パラメトリックイコライザなら1サンプル毎に係数をゆっくり変更するので合ってる。
ただ、IIRの場合、その係数の変更途中で分母のゲインが変わってくるから
構成方法によっては更新速度の影響が出て来る。
でも、実用的には、ひたすらユックリ変更するという事で逃げればいい。
390 :
デフォルトの名無しさん :2008/01/26(土) 13:26:38
よくわかってないんだけど、1サンプル毎に係数をゆっくり変更と言ってるのって、 パライコのフェーダー操作したときの話?
グリグリって書いてるじゃん
そういえばというか、 IIRが係数を急激に変化させたとき不安定になるのって 遅延器内の値も適切に補正できれば回避できたりしないかね?
393 :
376 :2008/01/27(日) 17:49:43
みなさん、ありがとうございます。キーワードを参考に、ネット記事と書籍を読みふけってます。
>>386 「直線位相」でググるとFIRの記述が多く見つかりましたが、IIRにも同様の内容があてはまるのでしょうか?
現在、複素数平面とかに関して勉強してるので、そのうちにでてくる気もしていますが・・・
>>387 オフライン処理になるとは思いますが、上手くいけばリアルタイムも考えてます。
それも担ってステップが少ないIIRを選んだのですが、間違いだったかな。
「群遅延」とは周波数全体の位相が同時にズレるという認識であってますか?
一応、サイトとかまわってみたのですが、どうもシックリくる説明が見つからなくて困ってます。
>>388 説明不足でした。スミマセン
パライコのように目標の周波数を引き上げるのではなくて、その周波数帯を取り出したいんです。
さらに、その帯域をリアルタイムでグリグリと移動させたいなと考えてます。
なので、ピーキングではなくてバンドパスを組み合わせたいのですが、
バンドパスさせた複数の波形をそのままミキシングすると波形が壊れてしまったので、問題と原因を探してるところです。
# 根本は数学を分かってないところが大問題なのですがw
↑改行制限で分割されました↓
394 :
376 :2008/01/27(日) 17:50:14
>>389 >構成方法によっては更新速度の影響が出て来る。
この影響範囲(時間?)を事前に算出するような事は可能なのでしょうかあ?
# まぁ、今の僕にはできないとしてw
勉強を進めていくうちにできるようになるのか、現実的に不可能なのかだけでも教えてもらえると助かります。
>>390-391 中心周波数をリアルタイムでグリグリと変更して取り出したいと考えてます。
グライコのようにピークを線形移動させるというイメージです。
十分なサンプリングレートが取れていれば、ゆっくり係数を移動させる事ができそうなので、その方向で考えてます。
25Hz -> 20kHz へ1秒で移動の場合、44.1kHz/secで1サンプル +22.32Hzの変更となってしまいますが、
まぁ、ここまで過激な対応が可能かどうかは別として。
>>392 急激な移動が起こる各バンド帯を並列で計算しておいて、移動時に遅延させるという事でしょうか?
FIRの場合は遅延を入れただけの信号に対しての直線位相となる。 つまりZ^n で割った時に、 Zに複素数を入れた結果の虚数成分が常に0である必要がある。 だから、分母に遅延要素以外がある IIRでは直線位相は実現出来ない。 直線位相でなければいけないのならFIRにするしかない。 しかし、FIRで25HzのBPFなんて作ろうとしたらどれだけタップ数が必要か しかもそれをリアルタイムにf0を更新しようとしたら、まあ無理。 やるとしたらFFTで計算させるしかないね。 常にそういうスイープするなら、 FFTで時間引き伸ばしパルスなんて作るといいのかも とりあえず、どうして直線位相でなければいけないのか どういう用途か判れば、アドバイスしてくれる人がいるのかも
>>393 >「群遅延」とは周波数全体の位相が同時にズレるという認識であってますか?
簡単にいうと、(位相遅れによる)各周波数での遅延時間。定義は位相遅れの周波数微分。
(全体で一つの群遅延ではなく、周波数毎に群遅延値が出てくる点に注意)
位相遅れ量が等しくても、周波数によって波長が変わるので遅延時間は変化する。
波長によって遅延時間が違えば当然波形が歪むので、それをチェックするために群遅延を使う。
で、周波数-位相遅れのグラフが直線になる場合を直線位相といって、
グラフが直線→位相遅れの周波数微分が一定→遅延時間(群遅延)が
全帯域で一定→波形が壊れない→(゚Д゚)ウマー
397 :
デフォルトの名無しさん :2008/01/28(月) 06:15:24
いまいち何を実現したいのかがわからないな。 FFTして取り出したい帯域をぶっこぬくのじゃだめなの? 目的は解析?それとも音色?
>バンドパスさせた複数の波形をそのままミキシングする といってたから直線位相なんじゃまいか。 >ミキシング用 >グリグリ ということだからVSTエフェクトでも作りたいんだろうとは読み取れるけど。 まここはDTM板じゃないので、住人も幅広く 絞って説明しないとわかってもらえないときあるかもね 単にグリグリだったらIIRのバンドパスで f0急激に変化しないように制限すれば良さそうだけど、 複数の周波数帯取り出して合成しなきゃいけないんなら、FFTが現実的かもね。 ただこの場合はグリグリするにも周波数方向の分解能は制限をうけるから なめらかさは犠牲になるかなあ。
DFTおよびFFTのプログラムを作ってみたのですが DFTとFFTで結果がまるで違います。 しかし両方とも逆変換をすると、元の値に戻るのは確認したので 計算はあってると思うのですが、さっぱりわかりません。 実験は以下のようにやってみました。 ・元信号をsin関数で作って配列Xに入れる ・XにDFTおよびFFTをかけたものを配列Fに入れる ・FにIDFTおよびIFFTをかけたものを配列Yに入れる ・XとYの実軸の値はほぼ同じ。 虚軸に誤差と思われる値が入っているのは確認しています。 何か誤差が発生していたりするのでしょうか?
Σsin*Xn で求めたものと FFTで求めたものでは 誤差の種類は違うよ。 80bit浮動小数点で計算してる? 64bitのdoubleだと結構4096点くらいでも気になる誤差だよ。 でも計算があってるかどうかは、サイン波を合成したのを入力してみればいいと思うのだが?
まさかとは思うが DCTとFFT比較してたりしないよな
レス下さった方には申し訳ないのですが もっと初歩的でした。 振幅と位相の計算をしてませんでした・・・ 結果がまるで違うように見えたのは 有効数字やcos、sinなどの関数の誤差によって あまり関係の無いパラメータが変動しているためでした。 無事FFTの計算はできるようになったので いろいろやって見ようと思います。 ありがとうございました。
403 :
デフォルトの名無しさん :2008/02/02(土) 02:47:09
すみません質問です。 ステレオでLRの位相を90度ずらすと、左右に音が分離して聞こえますが、 この左右に離れている音の位置間隔を中心寄りに縮めるには、どうしたらよいのでしょうか? 0〜90度の間で左右の位相幅をいじっても、90度近くないと結局音が分離したようには聞こえず、 90度近いと逆に左右に音が離れすぎてしまいます。 LRのパンニングではなく、コーラスとしてステレオ感を調節するエフェクターを実装したいのですが、 良い実装方法などありましたらご教授ください。
MSバランス
位相を弄るんじゃなくて、遅延時間を弄る方がいいと思うよ。 ただ、遅延時間をスムースに変更するのは ・100タップくらいのFIRの係数を多数用意しておく ・あらかじめ高域をカットしておいて6タップくらいのFIRで1/2遅延と按分 ・内部で4倍くらいオーバーサンプリングして// あと、遅延時間だけでは移動感が出ない。音量も変更しないと
音楽から和音抽出ってむずいねw
フーリエ変換すれば何とかならんこともない
そんなもんで出来るんなら苦労しないわ。 和音抽出するには、まず識別する事が必要。フーリエ変換だけじゃ無理。
倍音が邪魔だし
倍音成分含む音なら基音を簡単に見つけられる。 倍音成分が少ない(無い)音やピッチが揺れる音(ベル系)は難しい。 その音が和音だと解っているなら和音も見つけられる。調も解れば精度が上がる。 ただ、和音の中に倍音がある場合(ギターのコード等)はフーリエだけじゃ多分無理。
ドラムとかシンセとかいろいろ入ってると難しいだろうな
412 :
403 :2008/02/03(日) 05:37:33
413 :
403 :2008/02/03(日) 05:38:06
>>405 遅延時間をいじるというのは、LRそれぞれに別のFIRをかけて、
左右の遅延時間に差をつけるということでしょうか?
コーラスの場合は、左右のディレイ分の変化、つまりピッチ感の変化の位相を
ずらすことによって、同じ音源を微妙に違うものとして耳に届けることで、ステレオ感が表現できると理解しているのですが、
FIRの場合は、左右のフィルタの係り具合、つまり音色の微妙な違いによって、ステレオ感を表現するということでしょうか?
その場合、ステレオ音の広がりの間隔をどのようにして調節するのかが理解できていないのですが、
もう少しヒントをお願いできないでしょうか?
遅延時間を変更するのに1サンプル遅延するのに苦労は無いけど 0.5遅延するのにどうする? 単に2つの平均を取ると、これはLPFになってしまう。 高域をあまりカットしないで0.5遅延したいというような場合には 比較的長いFIRフィルタが必要。
というか、コーラス等のエフェクタ用途だったら、 遅延時間の解像度はサンプル単位で十分なのでは? というか経験的には十分だったような。(44.1KHzとかのサンプリングレートなら) どの程度のS/Nになるかは計算できないんだけどさ。
それで十分というならソレでいいんじゃない? 両耳の距離が17cmとして 170/340E3*44100 で22サンプルの遅延分 1サンプル単位にカクカクと変更しても気にならないといえばならない。 とりあえず思うような特性になるかどうか試してみるといいよ
コード抽出なら離散ウェーブレットじゃないの 再構成しないならオクターブバンドより狭く解析できるし 時間解像度的にも有利
その手の題材って、研究目的とかじっくりと取り組めるのでなけりゃ、 なかなか手を出しにくいね。 いくらかうまくいったとしても、道具としての実用レベルまでは遠い道のり・・・
419 :
403 :2008/02/05(火) 03:52:34
>>405 >>414 >>415 >>416 回答ありがとうございます。
両耳への到達時間を1サンプル以下の単位で操作するためにFIRを利用するという意味なんですね。
やっと理解しました。
ちょっと実験してみたいと思います。
ありがとうございました!
サウンドカード付属のマイク入力(3.5ミニ)から入力された音声を リアルタイム(非バッチ処理)にディジタル処理するプログラムの作成を考えています. 計測機器などはその製品ごと(というか会社ごと?)にコマンドが異なりますが, サウンドカードも同様なのでしょうか? windows Visual C++6 での開発を考えていますが, 後にUNIX系に移植するつもりです. 関数の使いまわしが出来るのかが心配になり質問しに来ました. お願いします.
入出力は処理系依存だと思うけど
423 :
420 :2008/02/07(木) 16:19:16
424 :
デフォルトの名無しさん :2008/02/11(月) 00:00:11
板違いかもしれませんが、質問させてください。 WindowsMediaPlayerのプレイビューのような、音楽にシンクロしてグラフィングが 変化する物(名前がわかりません)の作成の仕方が知りたいのですが、 どのように調べていいのかもわからず困っております。 ご存知の方がいましたら、調べ方についておしえてください。
>>424 それはグラフィクイコライザというものです。
音の高さに合わせて、それぞれの音の高さの音の大きさを棒グラフで表示します。
WMP等はこれをリアルタイムで行います。
原理は、フーリエ変換というものを使って信号を処理してそれぞれの周波数のゲインを解析しています。
手がかりは書いた。あとは検索しろ。
426 :
デフォルトの名無しさん :2008/02/11(月) 00:09:05
ありがとうございます。 大変重要な手がかりをいただけました。 早速検索してきますー。
ス ペ ク ト ラ ム ア ナ ラ イ ザ だ
ワロタ
>>425 あれって本当にフーリエ変換なんてやってるのだろうか?
大体のふいんきが分かれば十分だからもっと簡単な実装で良いんじゃないかと思わなくもない。
フィルタした音を再構成して使うんじゃなければただのIIRバンドパスで十分かもね。位相回ってもパワーには影響しないし。 IIRで完全なクロスオーバー作るのは難しいから、各バンドのパワーの和を厳密に元信号と一致させたいときは使えないけど、 棒グラフ程度なら十分だと思う
出てくる絵が変わっていけばいいだけなら、 無理にfftかけなくてもいいだろうけど、 スペクトル出すならなんかやってんだろうね。
パソコンの場合は十分な演算能力あるからFFTでもOK ただ、FFTの都度CPUの負荷が上がるから消費電流の変動がノイズとなって聞こえるという困った事に なおMP3はそもそも周波数毎に分割されてるのを再構成してるから、その時の情報を残している 可能性もある。 マイコン内蔵のDSPなんかで実現してる場合は IIRフィルタでも共振型というかサイン波オシレータの構成だろう。 ようするにQ無限大の共振器に単発の窓関数かけて結果を見る 1個の共振器を時分割で使い回せば負荷も軽い
いつもは過疎スレなのにネタが落とされるとすぐにレスが付くな。
なんか前スレあたりでもほぼ同じ流れみたような そしてそこでも、スペアナをグライコとよんでるやつがw
グライコがスペアナの意味で使われてて混乱してたけど、やっぱり違ったか。
437 :
デフォルトの名無しさん :2008/02/11(月) 15:20:50
>>436 なんか多くの素人が同じ間違いをしてる。
音楽やってたことある人でも多いし。
おそらくコンポやカーステレオでスペアナとグライコの表示が似てるせいだろう。
グライコはどうやってるんだろな IIRフィルタだっていうけど、係数を全部いっぺん変更してるんだろか?
双二次で検索
多分、一番多い実装は、 RBJ Audio-EQ-Cookbook で言うところの 双二次のピーキングIIRを複数つないでる。
b0 = 1 + alpha*A b1 = -2*cos(w0) b2 = 1 - alpha*A a0 = 1 + alpha/A a1 = -2*cos(w0) a2 = 1 - alpha/A コレって、 1/Aの部分で割算が必要だし 結局 a0で割らないといけないから、リアルタイムにこのまま計算してるとは思えないなんだよね
>>441 その割り算(a_i, b_i の計算)は、イコライザの設定変更時だけしかしなくて、
毎サイクルは必要ない。
イコライザだからAの変更は必要だよね? そうすると 1/a0も計算しないといけないよね? だから、割り算しなくていいような構成方法あるんじゃないの?
設定変更時だけだし多少遅くても割り算やってる。
A の変更の頻度、それほど高くないはずだから、 割り算のコストをそこまでシビアに考えなくてもいいんじゃないかと。 除算器乗ってないプロセッサでも、除算表持ったり近似計算したりで、 割り算全く出来ないわけではないし。
逆数を乗算してもいいな そういう話をしてるんじゃないのは分かってるけどw
イコライザいけるならHPFでもいけるかと思って リアルタイムで係数書き換えたらあっさり発振した。 やっぱだめか。
イコライザも係数を一気に書き換えたら発振するよ 書き換えでフィードバックゲインが大きく変わるから、 結果オーバフローすると不安定になる。
だから俺はFIR派
FIRで、RBJみたいに簡単に扱える方法はあるの?
FIRでバンドパスフィルタを作っておけば直線位相だから 元の信号の遅延信号と加減算できるんだよ。 元の信号に足せば、そのバンドだけポコンの持ち上がるし 足せば下げられる。 IIIRでも同じなんだけどね
IIRは結果の加減算やろうとすると位相差のせいでうまくいかないからねぇ てかRBJって何?
いや、バンドパスの頂点はゼロ位相だから 加算は可能だよ。 その特性は IIR-ピーキングイコライザのものと殆ど同じ ただQはだいぶ調整必要なのとf0も少しズレるように思ったな
頂点以外ずれるから問題なんだろう
それを言うならIIRのピーキングイコライザも問題って事になる
いや、位相がずれたものを元音に加減算することが問題って話ですよ
だからIIRピーキングイコライザも、位相はピークでは一致するけど その前後では 〜 になる。 そして、IIRバンドパスのを加算しても、これは同じだから、同じだって
ん?ピーキングでもバンドパスでも位相がずれるのは当然、そりゃわかってる 問題はそれを元音に加減算することだと言ってるわけですよ。 位相がずれた音を元音に加減算したら周波数特性に影響が出るしょ? までも、バンドパスは位相のズレ幅と同じスロープで減衰してるから、 大きな特性変化にはならないかもだけど。 まちがってたらすまん
速い話 IIRピーキング = 元音 + IIRバンドパス でははない。ということ。 周波数特性が崩れる。
だからさあ
BPFの係数と
b0 = alpha
b1 = 0
b2 = -alpha
a0 = 1 + alpha
a1 = -2*cos(w0)
a2 = 1 - alpha
>>441 を比べてごらん
構造の違いは b1がゼロかどうかだろ?
BPFと元信号1遅延したのと重みを調整して加算したら区別付かないんだって
>>453 なんだ、それか。妙な略し方だなぁ……。
>>462 よく分かってないんだけど、
>>441 でA=1として
b0 = 1 + alpha
b1 = -2*cos(w0)
b2 = 1 - alpha
a0 = 1 + alpha
a1 = -2*cos(w0)
a2 = 1 - alpha
a系列は共通だから分母は無視するとして、
441のH(z)の分子 = 1 + alpha - 2*cos(w0)*z^-1 + (1 - alpha)*z^-2
462のH(z)の分子 = alpha - alpha * z^-2
分子部分の違いは
1 - 2*cos(w0)*z^-1 + z^-2
これが
> BPFと元信号1遅延したのと重みを調整して加算
でどう区別つかなくなるのか知りたい……。
A=1の時 BPF/alpha *(1+alpha) + -2*cos(w0)*z^-1 とすれば一致するようだね
他スレから誘導されてきました if文で、if (音を感知したら) do ○○ っていう感じのプログラムを考えているのですが その音を感知する部分で何か有効的な物ありますか? (音はその時しか扱いません)
リアルタイム処理なら常に音量のゲインを見張って、 それが閾値に達したら別スレッドでdo○○に相当する関数を実行させるとか。
>>464 環境は? そして、その入力元は何? たとえばwindowsでマイク入力なのか、スピーカー出力なのか
>>465-466 ありがとう
windowsのマイク
何がしたいかっていうと
音を感知したら(どんな小さな音でもいいんだけど)、
HDDに録画をするっていうプログラムを作りたいんです。
だからゲインまでは必要ないかなとは思っています。
連続ごめん マイク入力のこと↑
どんな小さな音でもっていうけど 録音状態でマイクからの入力が0フラットのまま安定することってなかなか無い気がするけど。 ゲインを監視しなかったら録画しっぱなしになるな。 ていうかひょっとして、聞きたいのは録音するためのAPIとか、そんな程度じゃねぇの?
あ、そっかそうだよね... まぁとりあえず、ゲインは後で考えます そう、APIとかの事でした、質問が明確じゃなくてごめん。 何か良いのないかなと思って C++を考えてるけど
トリガの音にもよるんじゃね? チャイムとか時報みたいな単音かつ短い物ならFFTなりで周波数成分見て判別出来そうだけど、 比較的長めのジングルみたいなのはどこまで一致したらトリガ音と認識させるのかとか、 マイクからの入力だとちょっとした事で入力状態も変わってくると思うんだよなぁ。
ちょっと話はズレるんだけど、プログラムを走らせるパソコン外部の装置からのデータ入力の際に ノイズが完全に入らないデジタルな接続ふyふyふゆいおjhy「
ふじこ!
>>467 物音がしたら一定時間録画、防犯システムみたいなもんか。
スレ一通り見た?Winでのマイク入力については
>>16 以降とか、
>>420 以降あたりが参考になりそう。
当然、環境音やアナログ回路由来のノイズとかあるから、静かだったら入力0ってことはない。
ある値を超えたら、って具合に感度(スレッショルド)は設ける必要ありますよ。
それから常に空調が入っているような部屋の場合は、
ハイパスフィルタなどを使って検出に不要な帯域をできるだけカットする必要があるかもね。
475 :
デフォルトの名無しさん :2008/02/20(水) 05:07:39
質問なのですが、ここらへんの技術で食べていくにはどうしたら良いのでしょう、 この中でプロで音響関連のプログラマーをやってる方っていますか? やはりゲーム業界や計測器系の会社が多いんでしょうか? DAWの開発会社に勤めている方とかいましたら、ぜひ職場の雰囲気など教えてほしいです。 職場での立ち位置なんかも気になります。 やっぱりマニアックな分野の分だけ、発言権は低いのでしょうか。 大学での専攻分野が音響/信号処理関連でないと難しいとかやっぱりあるのでしょうか。
発言権てw
国産DAWやシーケンサーは、プログラマ1人で作ってるものがほとんど(過去のものも含む)。 1人の作業に雰囲気もなにもない。
職場の雰囲気なんて社風によったり、部署毎に違ったり、面白いやつが一人いるだけで変わるもんだから聞くだけ無駄。 ゲーム業界におけるサウンドの地位は基本的に底辺。 サウンド専用のメモリをメイン側で使われたって話も聞いたことがある程。 唯一コナミだけはサウンドの発言権が強いってんで有名だったけど、それも10年くらい昔に聞いた話だし現状どうなってるかは知らない。 組み込み系やサウンドツールはボチボチ仕事転がってるから需要あるかもしんない。 ってかマ板向けの内容だなw
Q ここらへんの技術で食べていくには A 自分を差別化出来るだけの技術を付けるしかない 音しか出来ないのでは駄目。 色んな事が出来た上で音も出来るのでなければならない。 算数や工業数学には強くないといけないね
算数は機械がやってくれるので問題ないだろ。 数学をやれ。
481 :
デフォルトの名無しさん :2008/02/20(水) 20:14:33
スタインバーグとか開発が海外でしかも音響専門のソフトウェア会社ならどうなのか気になる。 みんな楽しそうにやってるのか、デスマーチで死んでるのか。
>>479 技術よりネタだろうな、なんつーかもう何もかもやり尽された分野だし
FM音源が流行っていた時代、ソフトで音を作っていた時代が懐かしい。
今やるとするなら初音ミクみたいな奴とか
あえて技術で攻めるなら、このデータは効き難い事で有名といところで、圧縮、だがこれももう限界に近い。
他には音声認識もまだやれる事が多いかな、これは出力ではなくて入力なのでこのスレとはちょっと違う雰囲気か。
たしかに雰囲気は違うか でも語らうとしたらこのスレくらいしかって気もするな
Visual C++ 6
SDKにて開発をしています.
こちらをコピーして,マイクから録音したものをwav形式で保存しています.
ttp://www7a.biglobe.ne.jp/~lshen/EternalWindows/Sound/WAVE/WAVE11.html 処理の流れを見ると,
waveInOpen
waveInPrepareHeader
waveInAddBuffer
waveInStart
>録音中
waveInStop
waveInReset
waveInUnprepareHeader
waveInClose
で,最後にSaveWave関数内で wav ファイルに落としています.
ここで,信号を wav に落とさずに信号処理を行いたいのです.
おそらく wh.lpData 内にデータが書かれていると思うのですが,
サンプリング周波数(例では8kHz)によってデータを配列に並べる処理等が分かりません.
具体的には,録音をしたデータをフーリエ変換し,そこから別の処理へと繋げるつもりです.
ご教授願います.
>484 >474
>>484 wf.nChannels = 1;
wf.wFormatTag = WAVE_FORMAT_PCM;
wf.wBitsPerSample = 8;
wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8;
wf.nSamplesPerSec = 22050;
wh.lpData に モノラル 8bit 22.05KHzの配列として入力されている
FFTするなら、
wf.wBitsPerSample = 16;
として 16bit 符号付の配列として wh.lpData を扱えばいい。
連続して処理するなら、
waveInPrepareHeader
を2つ以上確保しておいて、MM_WIM_DATAメッセージを貰う都度、バッファを使いまわす事だ
487 :
484 :2008/02/21(木) 13:28:25
>>485 もちろん目を通しましたが,わかりませんでした.
>>486 ありがとうございます.8kHzではなく22.05kHzでした.
おそらく wh.lpData 内はバイナリで書かれていると思います.
バイナリファイルから数値を読み込むのは fopen( hoge, "rb") を利用すれば良いのですが,
バイナリとして書かれているものをアスキーの配列に入れなおすには
どうしたら良いのでしょうか?
調べる中で以下のサイトに辿り着きましたが,
こちらも fopen による処理でした
ttp://oku.edu.mie-u.ac.jp/~okumura/wavefmt.html よろしくお願いします.
チョットまだ基本的なC言語の考え方がわかってないようだ。 もう少しC言語の作法がわかる段階でないと説明する方も辛いんで勉強してくれ。 wf.wBitsPerSample = 8; だから wh.lpData にはバイト列で入ってる 符号なし8bitだから unsigned char *p= (unsigned char *)wh.lpData; とやれば for 文で (p[i]-0x80 ) とでも ( *p++ - 0x80 ) とでも 処理出来る。 wf.wBitsPerSample = 16; にしてやれば 16bit 符号付になる 同じように16bit幅の符号付ポインタに代入すればいい。
>>488 不勉強な中,質問させていただいて申し訳ありません.
ご丁寧なレス,感謝致します.頑張ります.
>>487 サウンドプログラム以前の話じゃん。
スレ違いだよ。
491 :
デフォルトの名無しさん :2008/02/25(月) 22:35:24
Windows上で、waveOutGetDevCaps()やwaveInGetDevCaps()で取得したデバイスの、 さらに詳細な情報を得るにはどうしたら良いでしょうか?そのデバイスがUSBオーディオ デバイスであるかどうかや、USBデバイスの場合はPIDやVID等を取得できるとうれしい んですが。 Setup APIと組み合わせればどうにかなるかなと思ったんですが、Setup APIで取得できる 情報と、waveOutGetDevCaps()/waveInGetDevCaps()で取得できる名前とのマッチング がとれないんですよね。WAVE APIだと、"(2)"とか"スピーカー"とか勝手についたりするし。 何か良いアイディアは無いでしょうか?
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4D36E96C-E325-11CE-BFC1-08002BE10318} を見るくらいかなあ・・・
質問です。 Q1. 信号を、ハミング窓をかけて50%オーバーラップしながらFFTして、 そのまま、逆FFTして、Overlap and Add した場合、信号が完全に 再現されるのでしょうか? Q2. 信号を、sine窓かけて50%オーバーラップしてMDCTして、 そのまま逆MDCTして、再度sine窓かけて、オーバーラップすると 信号は完全に再現されるのでしょうか?
理論上どうだったかは忘れたけど、 少なくとも窓関数が 0 近い辺りでは誤差が大きくて、 完全な再現ってのは無理。
FFT->逆FFTで完全に元に戻っているのだから、 窓関数がオーバーラップ処理でフラットになるかどうかの問題。 フラットになる窓関数は 180度の位相差のものと足して1になる必要がある。 ハニング/ハミング窓は A-(1-A)*cos(2πT/L)で 180度ズレると A+(1-A)cos(2πT/L) で加算すると2A だから、ハニング窓は完全に戻るし、ハミング窓は 0.54*2 のゲインが残るだけ サイン窓は 180度のズレは窓関数上は90度のズレになるので、 加算してもsin関数が残る。 そのサイズでモジュレーションした信号になってしまう FFT->加工->逆FFTとした場合は、一般的には完全には接続しない。 MP3なんかはうまく誤魔化してるけどね。 単純に考えても、音程のある成分は位相を合わす事が出来るけど でも位相を合わせると、ノイズは位相が合わせられないのだから 1/√2になる
>>495 詳しい説明ありがとうございました。
MP3は、なぜハミング窓を使わなかったのだろう、と思いまして。
sine窓の必然性が理解できてないのです。。。
>>496 周波数領域での加工を前提とすると、
FFT前に窓がけしないと、周波数領域の信号レベルの確度が悪くなる
逆FFT後に窓がけしないと、時間領域で接続性が悪い
上の理由から実務上2度窓がけする必要があって、かつ、2度の窓がけ後の結果の
オーバーラップが元信号に戻らないといけない。でも、han窓は1回の窓がけの
結果のオーバーラップで元に戻るように設計されてるから適さない。
で、上の条件を満たすsin窓とかVorbis窓が使われる。
なるほど、頭いいなー
499 :
デフォルトの名無しさん :2008/03/15(土) 16:21:05
すみません、質問なんですが サウンドプログラミングに関する本で、 picか何かでのサウンドドライバの作り方とか 一連のサウンドプログラミングが説明してある組込みの書籍か雑誌が発売されてたみたいなんですが、 本のタイトルがわからなくなって探すことができません。 それっぽいキーワードでググっても出てきません。 目次を眺めただけなので、具体的な内容は違うかもしれないのですが。。。 どなたか、上記の本のことをご存じないでしょうか?
picってMicrochip社のPIC?
501 :
499 :2008/03/15(土) 23:37:51
>>500 ごめんなさい、picかどうかも怪しいです。
僕はMicrochip社のPICのつもりで書きましたが、
そもそもpicじゃないかもしれないです。
質問内容が曖昧過ぎますよね。。。
今になって
>>499 の本にすごく興味が出てきてしまって。
PICだとすれば DsPIC だろうけど
ソレ、おれもおどろいたわ どういう仕組みなのかなあ
基音を分解したあと上音を再構成してるんだろうけど どの上音をどの基音に結びつけるかってのは、 あらかじめ楽器音を抽象化したサンプルのカタログから検索してるんじゃないかなぁ
>>506 それだと人の声とか、音の響き方が変わったときは無理じゃね?
解析中に倍音成分の偏りのテーブル作ってるんじゃないかなぁ。
試算は元波形から減算して0になればいいわけだから、その辺からも補完情報得られそうだ。
おかしなエフェクトかけた音とか食わしてみたい。
>>507 ナニガ?
サウンドプログラム的には初歩の初歩だろ。
位相を和音を基準に解析して、各周波数ごとにピッチ、スピード、再生タイミング等を調整できるようにしただけじゃね。 和音に分解するのにものすごい時間かかりそうだ。どちらかというとアイディアよりも速い速度を出したという努力の方が凄い。
>>509 短絡的に考え過ぎじゃまいか。
速度無視すりゃキミ作れる?
まあ、そういうこと言い出すと、情報系の研究の結構な割合が、 真新しい技術を作ることじゃなくて、既存技術を低演算量で実現ってノリよ。
どうせ解析がDWT、再生が可変速再生でしょ。 例えばV-Vocalとどう違うのか分からん。 新しい技術ってのは多くがまず理論の領域だからね 実践が重要な情報工学の分野は、どう実現するか、とかが重要になる。
>>512 アホか? どの周波数の音がどの音の倍音かってのを分解できなきゃいけないんだからV-Vocalとは全然違う。
音源分離の基礎から勉強しなおせ、このタコ。
>>513 さすがにサンプル全く聴かないで想像で書くとバレるかwww
ある意味安心した
サンプル聴いてみたが、全サンプル単音色なのね
これだったら、全体の倍音構成がある一つの倍音構成の重み付き和になるから
アタック検出とあわせて認識するのは可能かなー 専門が音声ですら無いから
最先端とか知らんけど
おまえ耳悪いんだな
やってることがすごいとかすごくないとかはよくわからないんだけど、 動画の中で音をばらす最初のシーンはかなり興奮したw
一から楽器を演奏して曲の音源を得るコストと、そのソフトを購入して既存の少ない音源から 元の音源が分からない程にまでリミックスして曲の音源を得るコストのどちらが高いか。 勿論後者の場合はもともとの音源が第三者には追跡不可能だし人格権を主張できないほど弄ってるから著作権料なんて発生しない。
論点変えて楽しいか?
一つのどうでもいいレスに対して話の流れから脱線しているように思うなら、無視すればいいだけのこと。
つうか板違いだろ
>>516 黙って消えろは酷いなw
さて、その動画今観てみたけど、やっぱり同種の楽器のサンプルしか無いね
一つだけギターとトランペットのサンプルがあるけど、音の小さいギターの方の認識は弱くなってる
支配的な倍音構成にフォーカスしてるのかな
>>523 お、やっと話せる人が来た 嬉しい
同時発音へのアプローチはどうなんだろうね。
そっちの動画は最初に観て、その感想が
>>514 なんだけど、うーん。
あるいは、同時発音といえどもms単位のアタック時刻ずれがあるからそれを検出して……とかなのかなぁ。
ただ低域になると時間精度が悪くなるから、そこまでの精度がでるのかどうか。
完全に同時発音のソースとか、BBE通したソースとかでどうなるか、とか興味あるなぁ
>>516 の動画でも、リバーブがきついと怪しいとか、2パートのピッチがクロスすると怪しいとか
おっちゃんも言ってるし。
って長文ごめん
>>524 前も書いたが、音源分離の基礎から勉強しろ。
「音源分離」でググれば、この分野の基礎技術がやまほどでてくるから。
>>525 あぁ、
>>513 で書いてるのか
ただの脊髄レスだと思って切ってたわ
音源分離ね。みてみる
527 :
523 :2008/03/21(金) 12:35:50
君自身が「話せない人」だと思うよーw
>>526 無知だってことを指摘されても、自分は悪くない、と放置するからいつまでたってもバカのままなんだよ。
はっきり言って、あんたの知識レベルは非常に低い。おそらく別な場所でもさんざん叩かれてるだろ?
それは人間性に問題があるからだぞ。
これは酷いw >526 なんか自身満々そうだし、試しに単音でもいいから分離アプリ作ってくれよ 音のアタックとリリース重なる部分の分離だけでも出来ればたいしたもんだと思うよ
>>524 専門外だと自覚してるならしゃしゃり出てくんなよ。
あんまり的外れなことばかり書くから、スレが妙な盛り上がりをしてるじゃねーか。
C(ド)の音色データを加工してDEFGAB〜の音を作ることはできますか?
>>529 単音のサンプル投下希望
自前サンプルだとまた叩かれそうだから
>>531 つ ピッチシフト
あとはフォルマント辺りを加えて調べてみるといいかも。
>>532 お前は頭大丈夫か?
これ以上叩かれる前に消えた方がいいぞ。
537 :
デフォルトの名無しさん :2008/03/22(土) 03:25:55
素人なので何がすごいのかわかりません
>>538 カクテルを材料毎に分離して比率を変えたりして再合成するようなもの
それは素晴らしい こう、チャレンジスピリッツが刺激される試みですね
そのうちリバースエンジニアリングが犯罪にされそうだな
マルチトラックな内部データを持つ同機能に見えるだけのfakeなら簡単に作れからなぁ 現物を調べないと投資を引き出すためだけの偽デモの可能性を否定できない
>>542 ねーよw
多少は都合のいいデータをデモに使ってるだろうけど
アタックが弱い楽器はトランスポーズできないのかな
すみません。 ピッチシフトはFFTをしないと実現できないのでしょうか?
IIRならなんでも
IIR調べましたが理解できませんでした。 単純に半音分の1.05946を時間にかけて伸ばしたり縮めたりするのは駄目ですか?
>>545 まず、一定間隔でサンプルを間引き/補間して
(音程も再生速度も変わる)、
その後、フレームに区切って、フレームをオーバーラップさせたり重複させたりで
再生時間を調整。
>>548 それならできそうです。
ありがとうございます。
>>549 オーバーラップさせるときに、重ね方ちょっと工夫しないとノイズっぽくなるから注意ね。
重なってるところが似たような波形になるように、
相互相関とかとって重ねる位置ずらす。
この方法で、綺麗な周期波形なら結構いい音になる。
最近はユーザが日本語化MOD作るからいらないよな
誤爆
高域を補完するフィルター(KENWOODのSupremeみたいな物)を作ろうと思うのですが サウンドプログラミングはやったことが無くどのような方向から手を付ければいいか判らない状態です まずは非リアルタイムで実験してみるつもりですが、ゆくゆくはリアルタイムで処理できるような物を作りたいです ソースをFFT→FFT結果を元に倍音生成のスペクトラムを生成→逆FFT→ソースと合成みたいな感じになるのでしょうか…? よろしくお願いします
たぶんFFTでは難しいと思うよ。 一般的にブロック・フーリエ変換の場合 周波数軸で加工すると実軸に戻した時に ブロック同士を接続させるのが難しい。 たとえば原音から高域だけ抽出して その成分を2乗3乗したのを加算するとかどうかな 倍角公式とか3倍角公式で高音を加算出来る事になるよ
ピッチや再生速度を変えるにはどうすればよいですか? サンプルを間引いたりするだけではうまくいきませんでした。 ググってもツールしかヒットしません(><;
>>555 このスレの1つ前の過去ログの先頭にある程度詳しく書いてある。
肝心なのは
>再生速度を変更するには、上げるにも下げるにも強力なLPFが必要になる
って所。 これをサボると駄目だね
>>555 ディレイを使うのも手。
重複を気にせず、再生速度を変えたのをたくさん並べるだけでもそれっぽくなる。
>558 555じゃないけど、サボるとエイリアシングノイズが出るって事? ピッチ上げるときはLPFかけないとマズそうなのはなんとなく解るんだけど、下げる時もLPFなの?
>>560 そう、アンチエイリアシング。
下げるときは、
簡単化のために、再生時間2倍、音程1/2で話すと、
元のサンプルの間に、まず、0を挿入するのね。
元のサンプルが 100, 110, 130 とかだったら、
100, 0, 110, 0, 130, 0 にする。
この状態をフーリエ変換すると、
元の周波数特性の高周波にエイリアスノイズが乗った状態になってるから、
それを LPF かけて取る。
0を挿入する意図が分からん。 100,100, 110,110, 130,130 じゃダメなのん。
>>562 それは0を挿入してから低品質な2タップFIR LPFをかけたのと同じことじゃん。
>>558 >>561 が言いたいのは、そのLPFをもっと強力なやつにしないと駄目よってことでしょ。
そうだね。 1+1/z っていうFIRフィルタの特性と同じで遮断特性は殆ど無いも同じ。 半音単位だと16:15とか16:17とかの比になるんで、 理論的には0を16個つめてFIRフィルタを通す事になるけど、 実際は0をつめる部分は掛け算しなくていいんで
>>562 もちろん、実際には内挿補間とかするんだけどな。
フーリエ変換の定義式に、0を挿入した奴を食わすと、理論式が綺麗なんだわ。
566 :
デフォルトの名無しさん :2008/04/23(水) 00:43:46
CUDA使ってる人っている? 並列処理がどれくらい速くなるんだろう。
567 :
sage :2008/04/23(水) 02:40:36
DCTベースでピッチシフトって(理論的に)出来ないんでしょうか? 32kHzでサンプリングした音を2048点のDCT(DCT-typeII)して、3半音分ずらして (1720点分のデータを2048点に補完)IDCT(DCT-typeIII)してみたら、なんか 元の2048サンプルが1720サンプルの波形に変換(残りは0近辺)されたような感じ っぽくなった(つまり単なる早回し?)んですけど… DCTでやってるのは、FFTは使ったことあるけどDCTはなかったから。あと、実数 なので楽かと思って。だた、変換結果をみると、位相成分も混ざってか(?) かえって扱いにくいようにも思えてきたところなんですが。 理論とか数学とかダメな方なので、実際にコード書いて実験してる次第。 ちなみにJavaでやってます。(慣れると)楽ですよ。描画も簡単だし。
出来ないか出来るかという話なら出来るんでしょう。 でも問題は 1、ブロックである事から接続の問題がどうしてもついてまわる事 2、周波数シフトそのものの計算の面倒さ 6:5 という比率なら5を6に移動するのは簡単だが6を7.2という事になると exp関数となる
> 100, 0, 110, 0, 130, 0 にする。 なんとなく、出力レベルが下がっちゃいそう。
じゃあその分ゲインをかければいいでしょ
571 :
567 :2008/04/24(木) 00:02:55
>>568 >5を6に移動するのは簡単
それすら上手くいってないんですけど。DCTした5要素をどうやって6要素に
分配(シフト)すればいいのか。sinc補間で5要素から6要素を求めてみたり、
5要素を適当に6要素に分配してみたりしたけど、IDCTしたら変になります。
(振幅が一旦大きくなったあと、小さくなるような波形になるっぽい)。
なんかシフトしたら係数を掛けないといけないんでしょうか?
>exp関数となる
全然わかりませんorz。オイラーとかがからむ話なんでしょうか。
>>571 DCTだと、位相が無視されるからなぁ。
振幅が大きくなってる箇所があるってのは、位相が狂ってるんだと思う。
定常波だと位相が狂ってても聞こえは一緒だったりするんだけど、
立ち上がりの部分が変わっちゃうと変な聞こえになりそう。
周波数領域でピッチシフトするなら、フーリエ変換にしないと駄目かなぁ。 ついでに言うと、対数振幅と位相をそれぞれsincなり何なりで補間。
574 :
553 :2008/04/24(木) 07:44:16
>>554 レス送れてすみません。ありがとうございます
1.ソースをFFTで周波数/強度に変換
2.1の周波数ごとに倍角公式、3倍角公式で倍音、3倍音を生成。音量は1の強度を元に適宜減衰
3.2を合成して補完音を生成
4.ソースと3を合成
みたいな感じでしょうか?
コーディング時には2〜4は同時に行った方がメモリのリソースは節約できそうですね…
えと、俺が書いた事は無視する事にしたのか誤解したのか、 俺が言ってるのは、ソレで2倍3倍の信号作って位相情報をどうするのって事。 元位相のまま2倍の位置にシフトしたら2度繰り返す事に 周波数軸上で変換するのは簡単じゃないよと。 だから 1、ソースのサンプル周波数変換 2.ソースからHPFで元サンプル周波数の1/4〜1/2の高域だけを抽出 3.2の2乗、3乗等の信号を作成 4.ソース+3の信号を重み調整し加算して出力 でいいんじゃないの?って事。
576 :
567 :2008/04/24(木) 21:07:53
>>572 >DCTだと、位相が無視されるからなぁ。
シフトするときの分配をちゃんと(元の値が対応する区間を求めて、比率に
あわせて配分。言葉で書くとわかりにくいなぁ)したら、ブロック途中の
振幅の暴れはマシになったけど、なぜかブロックの先頭から末尾に向かって
減衰します。なにか、大きな位相成分がおかしいのか…
>>573 >フーリエ変換にしないと駄目かなぁ。
やっぱりそうなんでしょうか。どっちも周波数成分への変換相当だから、
DFTとDCTは同じことが出来るのかと思ってました。
>>576 連続フーリエ変換なら話は楽だったりするけど、
離散だと、周期の都合で妙なことになったりするかなぁ。
ピッチシフトって周期が狂う非線形処理だから、根本的に DCT・DFT と相性悪いかも。
和音がわからない 誰だよ白鍵と黒鍵分けたアホは 全部半音単位で管理しろや
言われてみるとどういう基準で分けたのか気になるな。 流石に578はどうかと思うが。
音階が12なのは時間が12進なのと関係があるんか?
>>580 どういう基準もなにも、倍音とってったらドレミの音階が生まれるだろ。
それをオクターブ内におさまるようにしたら白鍵盤のぶんが埋まる。
そのときにだいたい半音、ってのが最少単位になってるからそれに合わせて鍵盤をわりふる。
西洋音楽の音階はだいたいそんな感じ。
>>582 倍音を拾っていってオクターブ内の音を分割した結果で、12等分がキリのいいとこに近かったんだよ。
地域によっては、12をさらに分割したのが最少単位だったりする。
純正律のことを言ってるのか? いわゆる純正律はそれはそれで恣意的だと思うが。 あるいはピタゴラス音律か。
ようするに ドミソ のソ 周波数比 2:3 の1.5が 2^(7/12) に近くて ドミソ のミ 周波数比 4:5 の1.25が 2^(4/12) に近いから 最初にドミソの和音が出来て、それを展開していってドレミファソラシドって事でしょ
>578 プログラム関係ねぇよw 和音やコード進行は音楽関係の教則本には必ずと言っていいほど載ってるし、 当たり前な話だけどギターなんかは全部半音単位だ。
>>578 全部白鍵だったらどれが「ド」だか分からなくなるだろ
無刻印HHKを扱える奴がいるから慣れだなw でもいやだなそんな鍵盤
そういう奴は周りから嫌だなと思われるのを生き甲斐としている。 疎外感と優越感の混ざった感覚。
ちょっと質問さしてください WAVやAIFFを読み込んで再生するプライバックサンプラーを作りたいと思ってるんですが 音階演奏のための再生ピッチ変更(引き延ばし・縮め)って、 普通というか主流というか、どうやるものなんでしょう? 少しためしてみた感じでは、単純な一次補間でもけっこう使える感じがしたんですが 市販のサンプラーなんかはどうしてるんですかね?
あらかじめアップサンプリングしたデータを持っているなら1次補間でもいけるだろうし そんなもの好きにやったらいいと思うけどな
DTM用で、あらかじめアップサンプリングしたデータを用意する ようなことは想定してないです。 好きにやったらといえば返す言葉がないんですけどね・・・ サンプリングレート変換と同じといえば同じなので もっとちゃんとした方法があることは理解してるんですが、 演奏が目的のサンプラーの類だと、 一次補間ぐらいやっとけば普通レベル??なのか気になったもので
>>592 いや自分でアップサンプリンしたのを内部データとして持っておけば
その1次補間でも十分実用になるという意味だよ。
アップサンプリングは元のサンプリング周波数の整数倍にすれば面倒なことは何もない
>>593 いえいえ、タイムストレッチ・ピッチシフトではなくて
単純な再生速度変更です。
>>594 なるほどーうまい方法ですね。
補間方法ばかり気にしてたんで、いやかなりはっとしました。
メモリは食いますけど、それなら再生時の負荷もほぼ同じのままS/Nアップしますね。
そういう実装してるのもあるのかなぁ
市販のサンプラー作ってた奴がいたとしても、そんなもんは企業秘密だから書けるわけねぇだろ 実装して問題が起ってるからアドバイスくれとかならともかく、抽象的すぎんぞ
597 :
デフォルトの名無しさん :2008/05/17(土) 18:23:59
えーと、サウンドプログラミングについての定番サイトってありますか? やりたいのは任意のWaveファイル(サンプラーとして)+ゲームパッドを使い、 リアルタイムに強弱をつけながらパーカッションを打ち鳴らして、 打ち込んだ結果をMIDIファイルやWaveファイルに保存したいです。 こういうゲームパッドドラム?を作って、楽しく、楽に打ち込みたいのです。
ググレカス
最近は感圧式ボタンや6AXISを備えたPC用ゲームパッドもあるから 一概にそうとも言えんぞ まぁそんなの持ってる奴は少ないだろうから テンポに合わせて自動的に裏表で強弱をつけることになるだろうがな
ボタンで強弱 = ストリートファイターなイメージがw すぐにボタンが壊れたから、感圧ボタン廃止 → 6ボタン制に。 あっ、ボタンによって強弱切り換えりゃいいじゃん。
プレステ2のコントローラは感圧になっただろ 調節は難しいが
素直にMPDとか使えよ。
>>606 使えます?定価的にも高いので、失敗したくなくて
MPDはゲームパッドじゃないよ
本が「使える」かどうかなんて、オカズになるかどうかに決まっているじゃないか。
山羊かよ!
>>611 ゴメン、君がその〜、童貞? だとは思わなかったから……
waveInGetPositionを使って録音中の場所を知り(場所がa[p]だったとする)、 a[p-1024]〜a[p-1]までのメモリを読んでみると、 どうもa[p-500]とか以降は、まだデータが書き込まれていないことが多い。 こういうものなの?
まさかとは思うが、short a[] なのに、p = mmt.u.cb とかってオチじゃねぇだろうな?
>>616 TIME_SAMPLESを指定しています。
まあ、waveInGetPositionで得た値から500を引いて使えばいいので、
困っているわけではないんだけど、何かすっきりしなくて。
618 :
デフォルトの名無しさん :2008/05/30(金) 16:52:58
学校の授業で、dsPICをつかってイコライザを作ろうと思っているのですが。。。 CDなどから音声信号をとってきて、高速A/D変換してデジタルフィルタにかけ出力という 流れ(まだ構想段階なので)でいこうと思うのですが、具体的にこれからどのように実現していけば いいでしょうか。
学校の先生に聞いて来い そのために授業料払ってんだろ
実は先生の方だって可能性もあるぞ。
正直 CDレベルの音質に対して dsPICってのはどうかな 16bitのDSPじゃ倍精度の演算に挑戦しないといけないぞ イコライザが高域だけにするか、 サンプリングを11Kとかに落とすんならなんとかなるか
>>618 プログラム板なのでソフトウェアに限定すると、
入力部とイコライザ部と出力部を実装するといいんじゃね
624 :
デフォルトの名無しさん :2008/06/01(日) 22:30:36
三角波や矩形波でAの音を鳴らす・・・くらいのプログラムから始めたい初心者なのですが、 まずは何から勉強したらいいのでしょうか? 言語はC、Javaあたりならなんでもいいです。。
鳴らすてのがどのくらいのレベルでやりたいのかわからないけど とりあえず任意の波形をWAVファイルを書き出せるようにやってみたら? WAV形式で作れるようになったら鳴らすのもAPIで出来る。
>>624 言語に関しては熟知してるという前提で話するけど、
サイン波を画面に描画するのと同じ要領で音声出力に書き出すだけ。
書き出し方は環境に依存するけどWinでいいなら
>>19 辺りに解説がある。
>>624 ドレミの基礎。A4が440Hzとかそういうとこから。
採譜の達人ってあるじゃん あれってどういうアルゴリズムだとおもう?
十数msec程度毎にFFTし各周波数を観察してノートオン/ノートオフを検索。 マッチングは単音ファイルの周波数の分布から。>倍音成分を多く含む音に対してsine.wavを割り当てると倍音も全部拾っている 12音階で近いノートに割り振るというアルゴリズムなので周波数の揺れる音色が取れない。>和音優先だから当然 みたいな感じじゃね?
>>628 どう見てもウェーブレット。単音をマザーウェーブレットにして変換するだけ。
631 :
624 :2008/06/04(水) 00:33:42
おかげさまで出来ました。 ありがとうございます。
先輩方にお聞きしたい。 次のプロジェクトでサウンドプログラムの担当をすることになりました。 (社内含めてサウンドプログラムを経験している方がいないけど) サウンドエンジン作れとのことですが、 経験則でいいのでどんなモノにしたらいいのか指針にしたいのでご意見下さい。 こんな出だしからして、音関係の知識はほぼありません。 「こういう勉強しろ」みたいなものやサイトがあればぜひ教えてください。 よろしくお願いします。
>632 お前の言ってる事は、 「今日からプログラマーになりました、何から勉強したらいいですか?」 っつーレベルだぞ。 何で使うシステムなのか、ハードのアクセラレーションはあるのか、 ドライバレベルなのかライブラリレベルなのか、何がしたくてどういった要求なのか。 全部スッポリ抜けてる。
というかどんなプロジェクトなんだか。 単純に考えてコンポーザとかゲームか。 なんだかんだ言ってサウンドはマイナーというか特殊扱いというかあまり扱わないよね。 WAVEの曲を背景にして効果音を鳴らすんなら音を足すだけでいい。 音階とかやるんなら周波数変えて合成とかする必要がある。 多分本当に初歩から勉強したいんだろうけど とりあえずリアルタイムな事は置いといてWAVEファイルの作り方とか 簡単な波形の音の作り方とかそれで「ドレミ」を鳴らしたり和音にしたりとかから入るといいかも。 そのあたりはググれば見つかるんじゃないの。 リアルタイムな鳴らし方はWindowsならAPIかDirectX関連で探して。 他は知らん。
今色々教えても、それを
>>632 が取捨選択できるようには思いにくいなあ。
やみくもに実装だけ覚えても結局何も作れないと思うので、
>>632 はまずは大まかにでもいいから仕様を決めた方がいいように思う。
(それがわからないとレスもし辛いような)
例えば単にベタのWAVファイルを鳴らすだけでいいのか、
ループも含めたBGMとして鳴らしたいとか、効果音も鳴らしたいとか。
プラットフォームは何で、それがどういう機能を持ってて、
それを補うために何を作って何を作らなくて良いのか、とか。
そうすれば何を覚えればよいのか自ずとわかるんではないだろうか。
偉そうでゴメン。
ない
638 :
632 :2008/06/07(土) 09:29:34
633,634,635>> 本当にすいません、指摘のまんま基本的な情報が抜けてました。 プロジェクトはPS3のゲームです。 詳しい要望が出てきてないので、設計をどうしたらいいかと悩んでました。 自分ではBGM,SEを単に流す程度しか思いつかず、 ゲーム系でサウンドエンジン作った方がいれば、 どんな機能をいれたのか知りたかったわけです。 633>> ありがとうございます、おかげで少し落ち着きました。 初めての事でビビり過ぎてたと思います。言われて我に返りました。 634,635>> PS3で何が出来るのかを探してはいるのですが、 音楽知識が無いままドキュメントを読んでるので、 自分では理解が不十分な感じがするのです。 なので、デジタルサウンドの基礎から勉強しなければと思いました。
PS3のゲーム作れるとはすごいなぁ。
ゲーム機ならライブラリとサンプルがあるはずだから基礎研究ならその辺弄ってあそんでりゃおk プロジェクト進行中ならチーフなり企画なりから何らかの仕様が降りてきてんじゃね?
3Dとかのエフェクトエンジンなのか MIDIデータとかの再生エンジンなのか ボイスとかのエンジンなのか それとも全部一式? 一人ではキツイだろな
バグゲーになりそうな悪寒。
643 :
632 :2008/06/08(日) 02:36:15
641>> 「MIDIも使いたいかも」みたいのは聞いた覚えがありますが、 上からの正式要件ではないので、一応対応するつもりです。 あとは5.1ch対応と3Dエフェクト(?どこぞの方向から音がする感じ)も…。 ちなみにボイスのエンジンとはどんなことするんでしょう。 なんかボイスの管理がどうとかリファレンスにあったけど、 音とは違うのだろうか。 バグゲーにはならないように頑張ります。 初めて一人で任された仕事なので、上でも一喝されてますしなんとかやってみる。 厳しいと感じたらまたアドバイスや気合もらいにきます。
ここは電話じゃないのか(´・ω・´)
ごばく
ライセンス買っておけば不具合があっても相手持ちにできるのに… 自社で作ったら自分で責任取らないといけないよな
CRIのは高いだけで良かった記憶ねぇなぁ。
>632 PS3の仕様は知らんからなんとも言えんけど 効果音とボイスは違うんかいな。 いや、PS3だ。違うかもしれない。
ノベルゲーでも作るんだろ ボイスはストリーム、効果音とBGMはオンメモリ・MIDIシーケンスで みたいな?
651 :
デフォルトの名無しさん :2008/06/09(月) 23:58:40
話ぶったぎってすいません、 デューティ比が50%である矩形波は普通の音に聞こえるのですが、 25%、12.5%になると雑音が混じったような音が出ます。(ビー、ガガガなど) これはサンプリングレートと音程の関係でこうなってしまうのでしょうか? また、なぜ50%の時はこういった雑音が入ってないように聞えるのでしょうか?
50%の時が一番サイン波に形近いからなぁ。 逆に、12.5%のとかは、クリック音が並んでるような音に近い。
>>651 50%だけ普通ってのはわからんが、
サンプリングレートに対して、半端な周波数を鳴らしているんじゃないのかな。かつ波形処理が簡易的な出力。
そうすると、山や谷の部分の間隔が1サンプル多い部分とそうでない部分とが出てくる。
それを聞くと、周波数の違う音が混じって、汚く聞こえる。
ビーはともかく、ガガガは確実に元の周波数より長い周期でうなってるな。
だから、
>>652-653 の理由だけでは説明が付かない。
波形うpしろ、解析してやっから
なるほどなぁ、矩形波生成した時点ですでにエイリアシングノイズがのってるのか。
659 :
651 :2008/06/10(火) 21:02:12
過去ログ読みました。勉強になります。
>>651 については
>>654 さんのおっしゃるとおりだと思います。
現在は、
フェーズの増加
phase+=( freq*(PI*2/sampleRate) );
値を返す
val=(phase<PI/8)? 1.0:-1.0;
こんな感じで補正が全くありません。
phaseにLPFをあてて倍音をカットすればいいのでしょうか?
無知ですいません。。
660 :
632 :2008/06/11(水) 01:27:24
>>649 私も「ボイスって声?だよな…」と一瞬考えたのですが、
ドキュメントの文脈と合わないので質問してみたんです。
で、調べてみるとシンセサイザとかで言う「音色」のことのようでした。
ドキュメント自体にそのように明言されていないので自信ないですが、
きっと音楽系の仕事をしてる人にはありきたりな内容かも知れません。
そんな感じで資料読むにも、
電子方面の音楽知識や単語を勉強したいところです。
「ディジタル・サウンド処理入門」って本でも読んでみます。
>>659 パルス=デルタ関数の帯域カットしたデータを 4〜32倍のオーバーサンプリングした結果をテーブルとしてもって
おいて
8倍なら
( round(phase*8) mod 8) から 8個単位のこのテーブルを引き
その結果を立ち上がり側なら積算、立下りながら減算する。
最初からデルタ関数ではなく、ステップにしたら良いと思うだろうけど
周波数が高くなってくると、デルタ関数同士がオーバーラップするようになるから
デルタ関数を積分した方が良い。
663 :
651 :2008/06/11(水) 23:01:14
なるほどです。
>>662 の帯域制限は
>>661 と同じ事なんでしょうか。(難しい…)
>>659 のコードを、
phase+=freq;
val=(phase<(sampleRate/8))? 1.0:-1.0;
こんな感じで書き直したら、以前あったノイズはなくなりました。
(VirtualNES(NSF)で鳴らした音と比較してます)
なんでノイズが消えたのか、よくわかってませんが・・・。
とりあえずこれで作成してみようと思います。
>>661 >>662 の方法はまだ理解できないのでこれから勉強します。
ありがとうございました。
>
>>662 の帯域制限は
>>661 と同じ事なんでしょうか。(難しい…)
方式が違う。 662 はサイン波合成で矩形波を作っている。
リアルタイム合成するにはサイン波を1,3,5,7の奇数倍周波数で位相を合わせて作れないといけない。
サウンドプログラミングを学ぶためにローパスフィルタを作ろうと考えました。 方法としては波形データ→FFT→特定の周波数以上のところを0に書き換え→逆FFT というのを考えたんですが、いざコーディングするとなると全く出来ないです。 wavデータを順番に配列に突っ込むというのは出来たんですが・・・ なにか参考になるサイトなどありますか?
じゃぁ本買いな
勉強する気もねぇ乞食かよ・・・
>>632 多分ゲームで必要になるのはストリームしながら再生、停止。
メモリに常駐している音(効果音、クリック音)の再生。
それらの音のボリュームの全体操作。
(画面が切り替わった時に前の効果音が残ったりしちゃうから。)
サウンド用の領域が溢れた時に音を鳴らさない、その旨を伝える手段。
場合によってはストリーム音のクロスフェード
(前の音を段々小さくして変わりに次の音を徐々に入れていく。)
それはなくても徐々に音を消す処理は必須。(いきなり消すとノイズが入る。)
この辺はハードが色々用意してくれてるだろうから、勢いでなんとかなる。
一番大変なのは、どの場面でも必要になるサウンド処理は、別スレッドで管理されることが多い。
サウンドはスレッドセーフで作らないと後で大変なことに。
後、BGMをストリームで流すとディスク上で常にシークが入る。
ロードを頻繁にするデータは、ディスクの外側よりBGMの隣にデータを配置した方が早くなる場合もある。
昔、隣の席でゲームのサウンドを開発している人を見た感想でした。
,,,,,,,,,,_ ,ィヾヾヾヾシiミ、 rミ゙`` ミミ、 {i ミミミl i゙i ,,,ノ 、,,-=、 ミミミ サウンドプログラム {_i=・}-{_=・`} ̄レゥ:} l ̄,,,,_,゙ ̄` :::ン フフン |/ _;__,、ヽ..::/l ヽ.~ニ~ ' .::::ノ/ }\_ _,,.-‐' `ー '"::/ / |  ̄`''ー-、 r‐''" ./ i\/ / | / ヽ / / | /;;;ヽ、 l ヽ / ノ /}
シミュ系のプログラムやってる人おる? 昔のビンテージエフェクターの回路図をソフトウェアでシミュとか
いけいけどんどんて
>>668 どんな本が良いですか?
そもそも公式に書かれた記号の意味が分からない
俺のようなものでは読むだけ無駄ですか? orz
勉強しろ
OHMの「マンガでわかるフーリエ解析」辺りから入ればいいんでねぇの?
音声をFFTして周波数領域でなんか処理してるプログラムのソースないですか?参考にしたい
キーコンをFFTで周波数領域でやってる人がいたと思うけど granul 分割統合法の方がシンプルで良好なようだよ。 ほかにはFFTはタップ数の多いFIRフィルタを計算するのに 計算量を減らすのに使われる。 周波数軸上で直接加工するのは難しいよ
音声の実信号x[n]があります。 ↓ 点数4096のFFTをかける ↓ 4096/2個のDFT値(実部と虚部) Xr[n] Xi[n]を得る。 ↓ パワースペクトル計算し xp[i] = Xr[i]*Xr[i] + Xi[i]*Xi[i] 対数とってdbに db[i]= 10*log[10] xp[i] という手順でスペクトル解析するプログラムを組みました。 入力として1khzのsin波を入力すると 1khz付近の値が一番大きく130[db]ぐらいになります。 これは正しい しかし、10khzでも値が50ぐらいあって、 他にあるスペアナのように綺麗にピークがでません。 原因とかわかりますか?困っています
680 :
679 :2008/06/28(土) 14:37:47
あと窓関数としてハミング窓かけています
80db差って10^8ってことだよねえ
682 :
デフォルトの名無しさん :2008/06/28(土) 16:37:27
って事は別に普通だということですか? フリーのスペアナだとそんなことはないんですが
入力x[n]のパワーは? 窓関数外した時の結果は? S/Nの閾値は?
音声の実信号ってのが16bitPCMなんじゃないの? そうするとデジタル誤差が丁度それくらいだと思うよ
実信号x[n]の代わりに、sin関数で生成した配列を入力に使って 理想状態のテストをやってみたら? その後、入力の位相をずらしてみたり、DCオフセットを追加してみたり、 16bitとか24bitに量子化するなど、各種の条件でテストしたら どの要素がどのように影響しているのかが見えてくると思う
>>683 窓関数いろいろ変えても良い結果はでないですね。
S/Nを区別する処理はしてません
>>684 そういうもんですかね?
>>685 例えば800Hzのsin波とかどうすればいいんでしょうか
>例えば800Hzのsin波とかどうすればいいんでしょうか #include <math.h> #define PI 3.14159265 #define NN 4096 #define Fs 10000.0 /* Sampling freq. 10kHz */ #define Freq1 800.0 /* Signal freq. 800Hz */ int i; double x[NN]; for(i=0;i<NN;i++) x[i] = sin(i*2.0*PI*Freq1/Fs);
>>686 16bitで量子化してると 6*15=90dBしかS/Nはないよ。
サイン波をソフト上で16bitのデータを作って入れても-105dB程度下にノイズが出てくる
サウンドの基礎が解ってないようだし、初心者本なり教科書なり読んで勉強するべき。
sin関数で生成したのでテストしてみました。1000hzのsin波で、サンプリング周波数は10k
FFTは4096点で、窓関数はハミングです
値はパワースペクトルです。
988.769531 [Hz]: 60.407160
991.210938 [Hz]: 52.110974
993.652344 [Hz]: 0.011060
996.093750 [Hz]: 6921.740936
998.535156 [Hz]: 681334.211257
1000.976563 [Hz]: 946209.472048
1003.417969 [Hz]: 31271.077880
1005.859375 [Hz]: 19.035879
1008.300781 [Hz]: 43.300825
なかなかいい結果になりました。993hzで値が小さいのが気になりますが。
97.656250 [Hz]: 0.061772
100.097656 [Hz]: 0.061831
102.539063 [Hz]: 0.061892
>>688 このあたりがノイズってことですよね。対数とってdbにするとマイナスでてきちゃうし
>>689 一応読んで勉強したつもりなんですが・・・ dbがマイナスとはどういうことでしょうか?音を吸収する?
>>689 分かってないのはサウンドの基礎だけではなかったようだ
1、 ムダな精度で表示するな 2、 周波数も対数化する方法を考えろ
>>690 なんでスペアナ作りたいのかしらんけど、作っても君の知識レベルでは使いこなせないから意味無いよ?
何を勉強したらいいですか
リア厨の予感がする
リア中でこれだったら逆にすげぇわ
今日び本読めばたいていのことは書いてあるから 付け焼刃的な知識で実装は小学生でも出来る その本を本当に理解するのに必要な基礎知識が抜けているのは 真っ当な教育を(まだ)受けていないから
ゆとり世代の大学の宿題
「何を勉強したらいいですか」の一文は最高にイカしてるなw 広がる話題でも無いし、後釣り宣言で収束キボンヌ
>>694 理系の大学1年生程度の数学。対数とフーリエ変換ぐらいは理解しとけ。
>>694 さんが
>>690 なら技術的というか工学的なセンスを磨く必要があると思うよ。
プラモでもいいし電子キットでもいいし、何でもいいからとにかく
実際に何か組み立てたり 雑学でいいから色んな本を読んで、
面白そうなものは作ってみる。
有効精度とか、この結果を出すのに何が一番効くかといったあたりからね
FFTの話からどんどん離れてきました
センターキャンセル処理で単純にL-Rするとオーバーフローする。 (L-R)/2ってしたらオーバーフローはしなくなりました。 でも気になる事があります。 元の数値が奇数だったら、切捨てされておかしなことになりませんか?
どうおかしくなると思うかを書いてみたら?
(L-R)/2が3の倍数になると頭がおかしくなる。
707 :
デフォルトの名無しさん :2008/07/09(水) 10:08:35
例えば波形の値が 300 303 だったら0.5倍すると150 151 となって二倍して元に戻そうとしても戻らなくなるので、データがちがくなってしまうのかなと
標本化定理が破られたと聞いて飛んできました! 今の時代、2倍以上の周波数でサンプリングしなくても デジタル処理を使うと元の信号を完全復元できるそうですが マジですか?
>>707 元に戻すような処理をするなら、2で割らず、余裕のあるところで計算しろ。
>>708 いましてるのは周波数じゃなくてビット数の話だろw
710 :
デフォルトの名無しさん :2008/07/09(水) 11:46:59
元には戻さないんですが いいのかな?って思うんです
>>710 センターキャンセルで1bitの誤差が問題になる場面なんてあるの? なけりゃ気にするな。
713 :
デフォルトの名無しさん :2008/07/09(水) 18:59:29
まぁ2で割るんで十分でしょ
>>708 いやいや、完全復元じゃない。
自然界に存在する音って調波構造持ってることが多いから、
低周波から倍音の推測がある程度可能って話。
こういう話が出るたびに標本化定理が破られたとか騒ぐ馬鹿がいるけど、原理が違うから。
>>709 別件の質問じゃね?
>>707 (L-R)/2 だけだと当然、下位1ビットの復元無理。
その±1の差がどの程度問題になるかって話で言うと、まあ、用途しだい。
(L+R)/2 の情報もあるなら、円め方のルール決めとけば完全復元可能。
716 :
デフォルトの名無しさん :2008/07/09(水) 23:30:17
(L+R)/2の情報持つぐらいなら、double型で(L-R)/2の情報を保持しといたほうがよくね?
>>716 もっと手っ取り早く、L/R/0.5*(L+R)の三つを保持しとけばよくね?
保存が必要なのは L と Rだけだろ (L-R)/2 はその場で計算出来る
まぁ数だけじゃなく質もいいけどな NT○研究所、ソ○ー アクセ○チュア まぁ君らニートには縁のない会社ばっかりだよ
周波数から音名への割り当て方ってどうすればいいですか? 例えばサンプリング周波数44.1khzのデータをN=8192の高速フーリエ変換をすると、 周波数分解能は5.38[hz]。 A3=440[hz]と考える。 440[hz]付近はこんな感じになってる 403.747559 409.130859 414.51416 419.897461 425.280762 [Hz] 430.664063 [Hz] 436.047363 [Hz] 441.430664 [Hz] 446.813965 [Hz] 452.197266 [Hz] G#3=415[hz]で、どこまでをG#のパワーとしてみなして、どこからどこまでをAのパワーとしてみなしていいかわかりません。 単純に区間を2分割だとまずいですよね
またこの人か・・・
すいません。上のFFTのひとです
だから、まず、有効数字ってのを体に叩き込め! 半音の比は2^(1/12) = 1.059 だから、半音の真ん中の音は 2^(0.5/12) =1.029 の所だ 440*2^(-1/12) = 415Hz 440*2^(-0.5/12) = 427Hz ここが真中 なお、 A=440Hzに対して 430Hzは Aの音じゃない。 調子外れの音だ 処理の都合で A に入れるだけって事だろ?
ありがとうございます。 430Hzの音はAとしてみなし、Aのパワーとして加算すべきなのか、 ゴミとして捨てるべきなのかが分かりません。 430Hzの音が実際なっていなくても、FFTすると430Hzのところにパワーが出てきてしまいますよね?
>>726 手段は目的の為にあるんであって
手段の細かい事だけ聞かれても、他人には判断のしようがない
厨房採譜ソフトでも作りたいんだろうよ
test
Windowsで、モールス信号を出すプログラムを作っています。 信号のオン/オフを、正弦波を生成して信号がないときには0で埋める方法で実装したのですが、 信号が切れるときにプツプツと酷いノイズが乗ってしまいました。 -- 10 9 7 0 0 0 0 0 0 -- 突然信号が0になってしまうのがノイズの原因と考え、信号が0に戻るまで待つことにしました。 -- 10 9 7 5 3 2 0 0 0 -- これでノイズはだいぶ軽減されたのですが、まだ残っています。 何かいい方法はないでしょうか。 あまり知識がないもので、何か参考になるサイトや書籍などを教えて頂けると嬉しいです。
>>731 エンベロープをつけろ。短い時間でフェードイン/アウトしろ。
プチプチしたほうがモールスっぽいよ
>>731 自前でサイン波形出力してるなら0クロス地点(付近)でカットすりゃいいだけだと思うが、
そもそも、その「10」とかって値の単位はなんだ?
モールス信号出力ライブラリみたいなのでもあんの?
「信号が0に戻るまで待つ」=「0クロス地点(付近)でカット」ってことじゃないの?
737 :
731 :2008/07/18(金) 23:42:24
>>732 エンベロープ調べてみます。アタック・ディケイをかけろということでしょうか。
短い時間なのでフェードを使うという発想はありませんでした。試してみます。
>>735 >>736 の通りです。数字は単なる例示なのであまり深く突っ込まないでください。
多分、フェードインやフェードアウトの処理は数ms〜数十ms程度の時間で良いはず。 アマチュア無線機で、この時間を調整してキークリックを低減するという改造記事を 見たことがあるし、セットモードで調整可能なメーカー製トランシーバーもある。
時間分解能があまり重要じゃない解析において、 手法を短時間フーリエ変換からウェーブレットにする利点ってある?
ある
具体的にどんなことですか?
>>741 テンプレートマッチングとかじゃね?
音声認識で使うみたいなの
FFTしたデータとのテンプレートマッチングでもいい気がするが
まあ、ウェーブレットも、マザーウェーブレットの種類次第では、 単なる窓掛け FFT でしかないし。
>>731 無音区間を0にするんじゃなくて、
そのまま保持してればいいんでは
10 9 7 7 7 7 7 7 7
って感じに。
…と書き込んでいいこと思いついた。 接線の傾きが大きいときにカットするからノイズになるというんだったら 0クロス地点じゃなくて、サインカーブのてっぺん つまり10、-10の時点で発振を止めて保持すればいいんじゃないかな。 10 9 7 5 3 2 0 -2 -3 -5 -7 -9 -10 -10 -10 -10 -10 -10 こういうことだ。
>>746 それ、オーディオ回路にダメージを与えかねないんじゃね?
まんま直流電圧掛けることになるからコイル系の素子に過電流が流れそうだ。
>>748 コンセプト抜きにして、数式上はね。
ガボールウェーブレットとか、ガウス窓の FFT でしかない。
>>746 直流成分
通常はD/Aコンバータのハイパスで取り除かれるかれるとは思うけど、
この手のプログラミングではやっちゃわないように気をつけるべきところでっせ
>>749 窓掛けFFTは時間単位、ウェーブレットは波数単位とかではなかったっけ
さすが天才は目の付け所が違うな… それよりロリぃ声を再現する関数が欲しい
年取るにつれてしわがれた声になるのは 喉にディストーションエフェクタをつけるようなもんだから ということは逆にディストーションをクリーンにするエフェクタがあれば って、うーん・・・
リアルタイムで波形を描画するプログラムを作ってますが、 MM_WOM_DONEが帰ってきたタイミングで波形を描画すると 音声再生が完了する前に波形を描ききってしまいます。 ネットの情報では音声再生が完了した場合にMM_WOM_DONEメッセージが返ると書かれていますが、 実際はMM_WOM_DONEメッセージが音声再生が完了したタイミングで返るのではなく、 デバイスに音声データを送信し終えた段階で返ってきているということなのでしょうか?
大きいバッファ一つだとそういう感じになるね。 waveOutPrepareHeader で小さい領域を数個作って ソレを繰り返し使いまわすようにするといい
なるほど。ありがとうございました。
758 :
デフォルトの名無しさん :2008/08/19(火) 05:57:23
>>605 使えるよ。めちゃくちゃ情報量多いのでレファレンス本として使ってる。
エフェクタの実装でつまったときとかに眺めてる。
歴史を網羅してる本(ちょっと古い)なんだけど、
アナログにおける実装とかをデジタルに落とすときに参考になる。
まあバイブルなんで、もっといたほうがいいと思う。
ウェーブデータから指定した周波数をカットする関数はありますか?
そりゃぁ、作ればあるだろうけど……
762 :
デフォルトの名無しさん :2008/08/28(木) 01:40:14
>>760 FFTして所望の周波数部分削って逆FFTしろ
763 :
デフォルトの名無しさん :2008/08/28(木) 01:42:45
ところでDirectAccessってその後どうなったのか
バンドパス処理する場合にはFFTして通過させる以外の周波数の振幅を0にしてIFFTするだけでいいの?
>>764 それでできるけど、FFT でやるとブロックノイズ対策が面倒よ。
普通に FIR とか IIR でバンドパスフィルタ作った方がいいと思う。
なぜブロックノイズが生じるのですか?
FFTは2^nサイズで処理するじゃない
データを全区間にわたってFFTするならブロックにならないけども。 データ長次第か。
終端のところは、前部分とオーバーラップさせて2^nにしたらダメですか?
>>769 まあ、それがブロックノイズ対策。
FFT の変種で MDCT ってのがあって、
オーバーラップさせて周波数領域で処理するんならそれ使うのが楽かも。
とはいえ、やっぱり FIR とかを避ける理由がよくわからん。
わかりました。FIR使ってみます。 避けたのは勉強してないからです
FFTを使えばパワースペクトルが得られるってのは、スペアナの実装でよく知られているし、よく目にするからでは。 あとFIRはフィルタの設計法が分からんとか。 昔の俺がそうだったんだが。
>>772 まさにそうですwww
FIRすればFFTいらないんですか?
winampのグライコってどんな仕組み?
俺は逆にFFT使う方法がわからん。 FFTして、弄りたい周波数の実部と虚部に係数かけてもどしゃいいだけ?
>>770 MDCTはDCT-4だから、ライブラリ選ぶかもね
まぁfftw使えば選べるけど
>>771 >>773 位相を見ないのならDFT(いわゆる普通のFFT)よりDCTの方が良いよ (境界条件の関係)。
DCT前の窓処理がほぼ不要で、オーバーラップのみで結構まともに仕上がる。
FIRは時系列処理で、それと等価な処理が DFT(+オーバーラップ)
でDFTの高速化アルゴリズムがFFT
こんなスレあったのか 知らなかった。。。
778 :
デフォルトの名無しさん :2008/09/26(金) 04:42:11
ようこそ、ラッキー7。 ここはム板でももっともマニアックなスレです。
779 :
デフォルトの名無しさん :2008/09/26(金) 05:04:35
俺もそのうち二次元に行くから許してやるよ。
781 :
デフォルトの名無しさん :2008/09/26(金) 15:30:40
2次元のFFTとか感覚的によくわからないんだよな。 音をFFTすると時間分が圧縮できるのは分かるが、画像をFFTして圧縮できるのはなぜ? 誰か教えてくり。
だが断る
>>781 イメージ的にだけど、
2次元のDCT=ある方向に濃淡が変化するレート
で、写真って一つの色に近い値に染まっている箇所がほとんど
(急激な変化は物体との境界にある)だから、例えば64x64の画像に
DCTをかますと、それは低周波数に集中する。
そこに音響で言えば周波数マスキングのような
心理的な情報を考慮させた量子化をすると、いい具合に低周波数
以外の部分が同じような値(0に近い値)になる。
同じような値が多いからエントロピーが少ない。だから、それに
ハフマン符号なんかをかますとファイルが圧縮できる。
間違っていたら訂正お願いします。
分かってるやつには分かるが分かってないやつには分からない 結局教科書読めって話になる
>>781 そもそも人間の視覚があんまり周波数の高い絵を認識してない
(細かいシマシマ描くと、その中間色あたりの単色に見える)
ので、高周波は多少劣化しても大丈夫。
786 :
デフォルトの名無しさん :2008/09/27(土) 00:54:20
>>783 >>781 ははあ、なるほど。
サンプリング周波数が44.1khzでとりあえず十分っていうのと似た話か。
FFTすることで圧縮されるわけじゃなく、FFT後の量子化の際に高周波を切り捨てることで圧縮するという感じ?
>>786 全部捨てるとさすがにあれだけど、
量子化ステップは高周波ほど荒くして問題ない。
いやだからそれは本質じゃないんだってば 平均情報量って知ってる?
>>788 量子化ステップ荒くしないと平均情報量そんなに変わらないよ。
べた塗画像とかならともかく、元々のエントロピーが高いものはFFTしてもやっぱエントロピー高い。
表現を変えただけなら情報量は変わらん。可逆圧縮が例。 非可逆圧縮だと、本質に影響少なくどうやって情報を切り捨てるかが重要で、 そのときに周波数領域とかの表現形式によってやりやすさが変わる
うそこけ
ほんとだって。 でないと、可逆でエントロピー減ることになるじゃない。 法則性が見つけやすいって意味で、 見掛け上の情報量が減ってる感じになることはあって、 本質的にはFFTしただけでは情報量減らない。
「表現をかえたという情報」の分だけ変わるじゃんよ?
>>793 それは、「低周波数しか成分持ってない」とか付随した知識がある場合にのみ有効。
実際のところ、画像はそれほど周波数偏ってない。
>>794 有効かどうかじゃなくて変わらんというのに反論してるんだよ
でもそれ、「低周波しか持ってない」って情報がある時点でエントロピー低いのでは。
えっと、要するに、エントロピーが変わるのは、 FFT かけた瞬間じゃなくて、負荷的な情報を与えた瞬間。
エントロピーの計算式覚えてるよね?
帰ってきたら色々レスついてるな
まずは
>>792 >>794 >>797 に同意
>>795 変わらない。記号列長と情報量は区別するべき。可逆圧縮で考えるなら、
圧縮することで記号列は短くなるが、その記号列が表す情報そのものは何も変わらない。
変わったら可逆じゃない。情報が変わらないから情報量も変わらない。OK?
可逆圧縮は情報を変えずに記号列を圧縮する操作、非可逆圧縮はそれに加えて情報自体も削減する。
表現形式を変えるだけのDFTで情報量は減らない。で、周波数領域にすることで例えば
「低周波成分が大半を占める」とか聴覚心理モデルとか**問題領域固有の知識**を入れて、
削っても影響のない情報を判別して削るのが非可逆の基本。
何度も言うが、表現形式を変えただけでは情報量は減らない。
800 :
デフォルトの名無しさん :2008/09/29(月) 10:00:27
なんかモンティホール問題と似てきたな。 誰か799の言ってることをモンティホール問題に置き換えて説明してれくれないだろうか。
このソースコードと出力結果の情報量は同じ? #include<stdio.h> #include<math.h> int main(void){ double theta; int i; for(i=0;i<10000;i++){ theta=i*0.001; printf("%f\n", sin(theta)); } return 0; }
>>801 本気で頭悪いのか?
理論と有限桁での実装の誤差ってのは何にしてもついて回るもんだから議論するだけ無駄。
>>801 周期関数の結果は非可逆だよねぇ。情報量はどうなるんだろ。
そう言えばFFTして逆FFTすると、強度の情報が失われないかな?
音や画像みたいに正規化しやすい場合はいいんだけれど。
# 演算誤差は目を瞑ったとしても。
0.001www
>>799 すばらしい説明をありがとう。
情報量を圧縮って意味がわからないよなそもそも。
806 :
801 :2008/09/29(月) 19:17:35
>>802 誤差が無ければ議論できるの?
#include<stdio.h>
int myrand(void){
static unsigned long seed=377743;
seed=seed*8209+6469;
return (seed
>>8 )&0xffff;
}
int main(void){
int i;
for(i=0;i<10000;i++){
printf("%d\n", myrand());
}
return 0;
}
>806 出力結果からそのソースが一意で起こせるならな。 ってか揚げ足取りがしたいだけだろお前。
808 :
801 :2008/09/29(月) 21:10:07
スマン 情報量云々を見るとつい…
2次元の話がずいぶん広がってしまったな。 なんか音の話題ないの。
ここにいるおまいらが今まで作った音響アプリの代表作って何よ。 俺はリズムサンプラー。
音響アプリなんだからいいだろ。 このスレ貴重なんだから盛り上げていこうぜ。
自分語りがしたいならマ板。 技術スレでする話題じゃねーわな。 糞スレ化するからいらんよ。
すいません技術的な質問です。 オーバーサンプリングって単純にプログラム内でサンプリング周波数の倍のデータとして扱えばそれでいいんでしょうか。 データ間は0をつめるとして、なぜそれでエイリアシング対策になるのかが理解できません。 たとえば44.1khzのWAVファイルを倍の88.2khzで扱ったとして、元データは44.1khzのデータしかないので、結局音そのものはクオリティ変わりませんよね。
キミが言っているのはオーバーサンプリングではなくアップサンプリングじゃないの。
例えば、20kHz以下の信号をAD変換したい時に、サンプリング周波数を
44.1kHzではなく88.2kHzにするのがオーバーサンプリング。
こうすれば、AD変換の前に必要なアンチエイリアシング・フィルタに必要な
遮断特性が緩和されるというメリットがある。
アップサンプリングについて説明すると、データの間に0を挿入してデータ数を
2倍にすれば2倍アップサンプリングになる。アップサンプリング後のデータには
エイリアスが発生しているので、それをFIRフィルタで削ってからDACで出力すれば、
DA変換後のスムージング・フィルタに必要な遮断特性が緩和される。
図が無いと判りにくいだろうから、詳しくは下記リンクを参照。
http://blackfin.s36.coreserver.jp/2191/program/polyphase/polyphase02.shtml
>アップサンプリング 漏れなら同じデータで穴埋めちゃう。 当然、波形がカクカクするが気にしない。 画像の拡大もカクカクしてるのが好きだから。
Lanczos3で補間したら適度なLPFにもなってるんじゃないの? 高級オーディオメーカWADIAの昔の製品はB-Splineだったな。 20kHzに近い波形はレベルも位相もボロボロになってるかもしれないけど どうせサンプル数が足りないから長tapのFIRでも大差ないでしょ。
>どうせサンプル数が足りないから長tapのFIRでも大差ないでしょ。 ここ詳しく。
>>817 音の「カクカク」はジッターノイズになって苦痛じゃない?
高周波が出ますナ
おまいらフィルタの設計時ってどんなツール使ってる?
dsPICworks dsPICつこてるので。
職場では MATLAB 自宅では GNU Octave
GNU Octave って、FIRやIIRのタップごとの計算とか簡単にできたりするの? GUIでスペクトル確認しながらとか。
GNU Octave は、基本的に対話型コマンドライン環境だからCUIになるけど、 (コマンド列をテキストファイルに書き出せば、スクリプト実行も可能) フィルタ設計コマンドでフィルタ係数を求めて、フィルタ特性をグラフ表示するのは簡単にできるよ。
へー、おもしろい。使ってみます。ありがとうー。
>>826 gnuplotと組み合わせてるのかな?
829 :
デフォルトの名無しさん :2008/10/04(土) 16:46:17
MAXMSPとかでパッチ作ってあそんでるんですが pluggoブリッジじゃなくて純粋なOSXのプラグインを 作りたいんですが、何から手をつけたらいいんでしょうか?
あー....。
結構色々調べたんですよ CoreAudioのプログラミングXcodeでやるんですね SourceForgeなんかにAUシンセのソース等みながら やってみます
MACはCoreAudioとかあるからなあ、結局サウンドプログラミングの出番ないよな。
んな訳ない。 波形を自分で作ったり加工したり…
それだけ?
サウンドプログラミングじゃないじゃん
サウンドデバイスプログラミングやAPI使用法はスレ違いだからすっこんでろw ここはもっとアカデミックで高尚な話題のスレなんだよ
デバイスなめんな
質問です。 自分の声って自分の耳で聞いた場合と、何かに録音して聞いた場合とでは違って聞こえますよね。 他人が実際どのように自分の声を認識しているのかを知りたくて、 それを聞けるようにするアプリを作ろうと思っているのですが、 そもそも技術的には可能でしょうか? どうしても大好きなあの子がどんな風に自分の声を聞いているのか知りたくてたまらないんです。 よろしくお願いします。
頭部インパルス応答ってあるじゃん あれの応用で、音源を喉部に固定して測定すればいいと思うよ
>>839 変態キモイ死ね
骨を伝ってくる音の特性を再現すれば出来そうだけど、
個人の骨格の違いでどの程度変わるのかってーのと、
そもそも個人個人で聞こえ方に差異があるはずだから無理じゃね?
>>839 頭の模型を作って喉にスピーカー、耳にマイクを仕込んで、IRを取れ。それつかってコンボリューション。
作ろうと思ってるなら自分で理論考えて作ればいいじゃん そのための脳みそがないってんならご愁傷様だ
単に他人の耳の位置にマイクを設置すればいいんじゃないの?
845 :
デフォルトの名無しさん :2008/10/09(木) 10:41:29
普通に録音して聞けばいいだろ。その子の聞こえ方をシミュしても、その結果を聞くのは自分なんだし
>>839 単に録音してそれを自分で聴くだけでいい。
難しいのは、自分の声を自分がどう聞いているかを
相手に聞かせることだ。
>831の者です グラニュラ・・・そしてFFT・・・・ 新しい音響はヒットチャートも揺るがしますよ みなさん頑張ってね!
849 :
840 :2008/10/10(金) 00:43:36
このスレで聞くくらいだから、まさか録音して聞けば済む程度の質問されるとは思わない罠w でもまぁ全く同じには聞こえないだろうけど。
その子の頭部を物理シュミレーションするしかないわな。 でもそれが測れるくらい仲がいいならもう付き合ってるよな。
>>850 >>851 それを言い出すとキリがないんじゃないか。
例えば「大好きなあの子がどんな風に自分の顔を見ているのか」知りたいのなら、
普通は「鏡を見ろ」と答えて、それで十分な答えだ。
あの子の水晶体や網膜の特性、視覚に関係する脳の働きまで考慮しないだろう。
みんな勘違いしているようだが、
>>839 は
その子自身の発した声を、その子自身がどう聞いているかを、知りたい って意味なんだよ。
ところで、non causalなら理想ローパスってつくれるんでしょ?
まあ、non causal ならねぇ
一瞬カジュアルって読んでしまった 理想ローパスって有限長でできるの?無限長なら先読みできたところで意味ない気が… 理解間違ってたらすまん
>>853 なるほど。全然気付かなかった。
「自分」という言葉を使ってるから両方の意味にとれるんだな。
その方法は俺も知りたいと思っていた。
適当なフィルタをかけて、どちらが似ているかを本人に選ばせ、
パラメータを微調整していく、というのくらいしか思いつかない。
>>853 日本語の「自分」は1〜3人称全部に使えるからわかりにくい〜
859 :
854 :2008/10/11(土) 19:40:18
>>856 あっしの理解では、フィルタが無限長でも
データが有限長なら可能かと。
ダウンサンプリングするプログラムつくりたいんだけど、 間引くデータはどう選んだらいいんですか?
1/2にするなら1/4fsでローパスして1つ飛ばしすれば速い。 整数比でなければリサンプリング。間引くじゃできん・・と思う。 間引くだけで可能なら俺も知りたい。
wavefs44.exeとかssrcのソースが参考になる。
奇遇だな 俺もssrcを勧めようと思っていたところだ
2つともソースもバイナリも入手不能っぽいのだが
ググって一番頭のサイトで手に入るけど?
ssrcって日本からアクセスブロックしてんじゃなかったっけ
海外のプロクシ経由でアクセスすれば問題無いでしょ。
DFTとDTFTの違いが理解できない…誰か解脱plz
870 :
デフォルトの名無しさん :2008/10/17(金) 02:54:09
SSRCみたいに、 サウンドプログラミングの参考になるオープンソースソフトって他にどんなのがありますか。
>>868 Wikipediaより
・入力が離散的なら、フーリエ変換は DTFT となる。
・入力が周期的なら、フーリエ変換はフーリエ級数となる。
・入力が離散的かつ周期的なら、フーリエ変換は DFT となる。
872 :
デフォルトの名無しさん :2008/10/17(金) 09:07:37
DFTは、有限区間での変換を行う。 DFTは実際にはそうとは限らないが、以下の仮定を置いて考える。 その時にその区間の信号が、周期的に無限に続くと考える。従って、信号の一端と多端が滑らかでない場合などに問題が生じる。 これらを解決するために、窓関数などが用いられるが、これによってスペクトル漏れという問題が起きる。 これに対し、DTFTは、実際に上記の過程が成立する場合ではないかと思う。
連続時間・無限区間 → フーリエ変換 連続時間・有限区間 → フーリエ級数 離散時間・無限区間 → 離散時間フーリエ変換(DTFT) 離散時間・有限区間 → 離散フーリエ変換(DFT)
どれも微妙に誤解を招きそうな回答ですな
ご存知とは思うが、周期関数を除いては客観的な周波数成分など定義されていないので、 DFTの結果はDFT変換結果でしかない。 f(t)=f(t+T)を常に満たす周期信号など実在しないから(だって過去には限界があるし未来は分からないから) 実際には周波数成分は未定義である。 ・・ということを念頭に置かないとフーリエ系周波数分析に過剰な期待をしすぎる。 ピッチが速く変化する人の声などはLPC分析のほうが成功を収めている。
>DFT変換
頭痛が痛いタイプの人か。
878 :
デフォルトの名無しさん :2008/10/21(火) 01:42:12
頭痛はほんとに痛いんだぞ!バカにしちゃだめ!死ぬよ!
879 :
デフォルトの名無しさん :2008/10/21(火) 04:20:59
大体でいいから音楽から歌声部分だけ目立たせるようにフィルタをかけたいんだが、 なかなかうまくいかん。 FIRフィルタで400-4000hzくらいを通したところで音楽がこもるだけだ。 フィルタで音声以外の部分を削る(性能はかなり低くていい)って無理なのか?
どの音も倍音成分含んだ上で音が成り立ってるから、 周波数だけでボーカル分離はできないと思う。 音量やパンも考えないと。
他に、「ボーカルはセンター付近にあって、他の楽器は左右に寄ってる」 って仮定のもとに分離を試みたりするらしいけども、 その仮定自体100%そうとはいえないし、 その仮定が正しい場合でも、たった2チャネルの信号から特定部分抜くのは難しい。
882 :
デフォルトの名無しさん :2008/10/21(火) 19:18:17
マイクから録音した音声を波形で表示したいのですが、 WaveInで録音したものをどうやって波形にすればいいのですか?
883 :
デフォルトの名無しさん :2008/10/21(火) 20:52:29
数値を時系列にプロット
質問です 超超基本的なシンセソフト(学研のふろくのsx-150みたいな)を作ってみたいです! プログラミング言語に関する知識は全くないです。(シンセソフト作りで一緒に勉強しようと思ってます) 使用する言語でおススメありますか?
C
C++
887 :
884 :2008/10/22(水) 01:50:29
>>885 >>886 ありがとうございます!
C言語で調べたところVSTSDKというのがあったんですが、
これを使ってVSTとして作った方が近道ですかね?
あと、よかったら参考になる本など教えてもらえるととても嬉しいです。
(この前それっぽい本を買ったんですが、シンセのことばかりでプログラミングのことが載ってなかったんですORZ。でも勉強にはなりました)
プログラムってのは成功失敗を問わず実践してこそ身につくもの。 人に聞く前に自分で実験してみたりはしないのかい? そもそも言語の基礎が解ってるならサウンドの基礎知識だけ学べば実装はそんなに難しく無いはずだし、 言語から勉強しようってんならスレ違い。
>>888 アドバイスありがとうございます!
少しでも近道しようっていう考えが間違ってました。
一人で頑張ります!
VSTって知らないけど、全部自分で作った方が面白いと思うよ。 sx-150シミュレーターというかエミュレーターというか。
>全部自分で VSTなど使わずって意味で。
むしろVSTなんか作ろうとしたら ゴールが遠すぎてあっという間に挫折するわな
893 :
868 :2008/10/22(水) 22:56:08
皆様解説サンクスです。コメントを総合して何となく分かってきました。
"解脱"に誰もツッこんでくれなくて(´・ω・`)ショボーン
>>889 >>892 プログラミングモデルとしては、VSTは分かりやすい方ですよ。
オブジェクト指向っていう壁はありますが、複雑多機能なフレームワーク
渡されるよりは学習コストは低いと思います。
基本的には、SDKで提供されるクラスを継承して処理を実装して、
そのクラスのインスタンスのポインタを返す関数を書いてエクスポートするだけです。
894 :
デフォルトの名無しさん :2008/10/24(金) 02:33:39
C#でサウンド操作関係のソフトを作ろうかと考えているんですが、waveOut系のような低レベル操作の出来るクラスが見つかりません。 DLLをインポートしてwaveOut系を使うしかないのでしょうか? また、低レベル操作の出来るクラスがあれば教えてください。
895 :
デフォルトの名無しさん :2008/10/24(金) 03:27:46
>>894 ManagedDirectX経由である程度できる。
昔MSDNにサンプルあったよ。
リズム/ドラムあたりで検索してみ。
896 :
デフォルトの名無しさん :2008/10/24(金) 03:32:13
897 :
894 :2008/10/24(金) 09:55:53
>895-896 さっそく調べてみます。 ありがとうございます!
898 :
デフォルトの名無しさん :2008/10/25(土) 01:40:18
遅延時間について教えてください。 FIRの設計で、周波数特性を先に決めて逆DFTかけてインパルス応答出しますよね。 このとき遅延時間が発生すると思いますが、この遅延時間を少なくする定石って何かあるのでしょうか。 サンプリング周波数を多くとるか、タップ数を減らすという考え方であってますか。 また、サンプリング周波数を多くとる場合、アップサンプリングでいいものなんでしょうか。 アホですみませんが、良く分からないので、よろしくお願いします。
>>898 アップサンプリングすると元の音のある帯域が相対的に低域に落ちる。で、
低域で精度確保しようとすると必要タップ数が増えて元の木阿弥。
タップ数減らしたいなら直接設計法をやめるのが早い
>>898 位相が歪んでもいいなら最少位相化でぐぐれ。
あとは、Remez アルゴリズムってので、
位相保ったまま、周波数特性の絶対値誤差を極力少なくできるんで、
それで所望の特性を少ないタップ数で実現できて遅延減らせる。
901 :
デフォルトの名無しさん :2008/10/26(日) 22:53:44
返答ありがとうございます。
>>899 ハイパスフィルタならアップサンプリングでも有効ですか?
>>900 なるほどー、Remz法って名前は知ってたのですがここで使うんですね。
>>901 意味が分からん
アップサンプリングで見かけ上出てくる高域にあるのはゼロ補間で出てくるエイリアス。
普通LPFでカットするし、音響的には害しかない。
903 :
デフォルトの名無しさん :2008/10/30(木) 17:17:14
音の出力の遅延時間そのものを自由に変更できるようにしたいんです。 その際多少音が悪くなってもかまわないので、1サンプル以下の単位で遅延時間を操作するためにFIRを使いたいと考えているのですが。 この場合定石ではどうやるんでしょうか...。アホですみません。
フィルターなんか使わなくても、普通のプログラムレベルで出来ると思う。
いやいや、分数精度遅延は普通FIR使うよ。 4〜6タップくらいで、ラグランジュ補間するのが一般的だと思う。 1サンプル以下の遅延ってのは要はサンプル間の補間
906 :
デフォルトの名無しさん :2008/10/31(金) 20:26:10
ピッチを変更せずに再生速度を変更するのにはどういった手段が考えられますでしょうか? FFTとかも触り程度にしかわからないのですが、お願いします。
>>903 アップサンプリング→遅延→ダウンサンプリング
途中適宜LPFを入れる
要は波の数を変えればいいんだよね
>>908 ,909,910
ありがとうございます。タイムストレッチっていうんですね
ただ一定間隔できって複製して並べるという部分がちょっと理解できませんでした。
周波数をそのままにして音を削っていくみたいな感じだとはおもうんですが…
クロスフェードで同じものを何度も繋げるだけだよ
913 :
デフォルトの名無しさん :2008/11/04(火) 00:43:08
音響信号(wavファイル)をFFTしてバンドパスフィルタかけて逆FFTする。 っていうことをしたいんですけど、いかんせんこの分野は初めてなのでやり方がわからないです。 こういった処理をするプログラムソースが載ってる本を知ってる方おられますか?
916 :
903 :2008/11/04(火) 14:25:36
>>905 907
ありがとうございます。亀レス申し訳ないです。
サンプル間の補間というのは、一度アップサンプリングして、サンプル間を0ではなく、
3〜5次のラグランジュで補間するという意味でしょうか?
さらにその補間済みのアップサンプリングされたデータに対して4〜6タップのF4IRをかけるということで良いのでしょうか?
>>916 いや、1/4, 2/4, 3/4 とかの位置のラグランジュ補間係数をあらかじめ計算しておく。
位置が決まってるラグランジュ補間は FIR フィルタで実装できる。
サウンドプログラムと言うより、フィルタの使い方ばっかりだな。
919 :
903 :2008/11/05(水) 13:42:01
>>917 回答ありがとうございます。
>位置が決まってるラグランジュ補間は FIR フィルタで実装できる
サンプリングデータに対する補間ではなく、FIRの係数に対する補間をせよという意味でしょうか?
たとえば、あるデータに4倍のアップサンプリングをするとして、
それにかける4倍サンプリングレート時のFIRの係数を、
元々のサンプリングレート時のときの係数を基にして、
ラグランジュ補間を用いて予め計算しておくということですか?
つまり、アップサンプリング時用のFIR係数を予め作成しておく、という理解でよいでしょうか?
フィルタの話ついでに IIRの演算で精度上げてったら演算誤差の蓄積とかの影響がすくなそうなんだけど 結局蓄積するから使い勝手はかわらんかな 安定し続けるようなもんができたらいいなぁと思ったり
DFTにおいての窓関数ってなんの意味があるんですか?区間の切り出しって意味で矩形窓はわかるんですが・・・
周期関数を仮定するDFTで不連続点の解消
それを解消するとなにがいいんですか? 窓関数で周波数分解能が変わるっていうのがわかりません。窓長で決まるものだとおもうんですが・・・
>>923 矩形で切り出したら両端はどうなるかを考えるんだ。
つか人に聞く前に実際に実験してみれ。
実験しましたが・・・ 分解能っていうのは周波数ビンの幅のことじゃなくて、裾に出てくるスペクトルがなくなるってことなんですか?
>>925 裾のスペクトルが他の部分を滲ませるから、窓がけをする。
大体ピークの鋭度とサイドローブ(裾のスペクトル)の漏れがトレードオフになっている。
だからこれは適材適所で、例えばパワースペクトルの概形を推定したいときには
窓をかけた方が大抵の場合はいいけど(かけないと小さな信号がサイドローブリーケージで埋もれる)
周波数が近い二つの正弦波を見分けるときなんかは窓をかけるとサイドローブは抑えられるけど
メインローブが広がるからむしろかけないほうがいい。
周波数分解能が変わるって表現は誤解を招くと思う。
928 :
927 :2008/11/05(水) 23:24:47
あ、今読んで思ったけど「誤解を招く」って表現が思い切り間違ってます。 周波数分解能がかわるというよりも時間と周波数の分解能でトレードオフを取る、と書くつもりでした。
なるほど。よくわかりました。広きに渡って周波数の分布をみたい場合に適した窓ってなんでしょうか? 採譜用なんですが、50〜2000hzぐらい
>>919 時刻 1, 2, 3, 4 の位置のデータから時刻 2.25, 2.5, 2.75 のデータを作るFIRフィルタを作るだけ。
>>929 採譜のどの部分かによる。アルゴリズムにもよるけども、音程を推定したいのなら矩形窓じゃないと
ベースの音高を推定するのに苦労すると思う。44.1kでサンプリングしたときの周波数分解能と
50Hz(オルガンの低音辺りだよな?)での半音での周波数差を見比べてみな。
あと、音色の分析とかだったらバーレットハン窓辺りが結構使われる。
てか採譜にFFTって時間分解能が全然実用的じゃない気が
933 :
903 :2008/11/11(火) 21:17:36
>>930 回答ありがとうございます。
亀レスで申し訳ないです。
>時刻 1, 2, 3, 4 の位置のデータから時刻 2.25, 2.5, 2.75 のデータを作るFIRフィルタを作るだけ
アップサンプリング時に、2.25などの分数の部分のデータを作って、それをダウンサンプリングして再生でいいんでしょうか。
それで分数遅延になるんでしょうか?
ちょっと頭がこんがらがってきました。
935 :
903 :2008/11/12(水) 06:18:39
>>934 この論文、まさに自分がやりたいことが書いてありそうなタイトルです。
理論のほうにも興味があるので、これ読みこんでみます。
ありがとうざいます!
936 :
デフォルトの名無しさん :2008/11/13(木) 06:16:07
タイムストレッチする際に、周期を求めないといけないと思うのですが、 その求め方というか決め方がわかりません。 具体的には、音声をフレーム毎に区切って、クロスフェードさせることで時間を圧縮しようと 思うのですが、フレームをどう区切るのがいいのかがわからないので、 アドバイスお願いします。
>>936 周期はユーザーパラメータでいいんじゃない?
CQ変換ってなんですか?
CQ CQ こちらJF8....です
940 :
デフォルトの名無しさん :2008/11/21(金) 01:27:08
かなり初心者な質問だと思いますが、返答していただけたら幸いです。
現在、音楽ファイル(wavファイル)をFFTし、バンドパスフィルタをかけ、IFFTするという作業をしているのですが、
音楽ファイルのデータを配列に入れるとき、ステレオデータだと右左右左(逆?)…と格納されますよね?
そこで左のデータと右のデータを別の配列に格納して、片方のデータだけを使用しているのですが、問題はないでしょうか?
目的としては音楽特徴量の抽出です。
またフィルタをかける際ですが、
勉強不足でフィルタをかけるタイミングがわかりません↓
配列に格納したデータをFFTした後フィルタをかけIFFTするのか、生のデータにかけるのか…
ちなみにFIRフィルタをかけるつもりですが、係数の計算方法がわからないので、
http://momiji.i.ishikawa-nct.ac.jp/dfdesign/fir/mado.shtml のサイトで得られる係数を利用したいと思っています。
そもそも考え方が間違っているかもしれません。
よろしければご鞭撻のほどよろしくお願いします。
前段は別けて問題ないが、特徴量の抽出が目的なら足しちゃえば? 後段は誰かに任せた
>>940 よくある半区間重複だと、
窓→FFT→係数をそれぞれ乗算→IFFT→窓→オーバーラップ
このやりかたの場合、2回の窓掛けの結果をオーバーラップする必要があるので
sin窓とかvorbis窓を使う必要がある。あとライブラリによって出力データの並びが
違うので、それにあわせて適切に係数乗算しないと変になる。
>>940 ソースデータにもよるし、片chで期待するデータが得られるならそのままでもいいし、
狙った効果でPANしてる曲とかはLR加算するとヘンに聞こえたりする場合も稀にある。
結果が解ってる実験なり課題なりなら最適な方選んでもいいし、
ステレオでFFT処理して、必要に応じて出力結果を波形編集ソフトで弄ってもいい。
それとFFTでフィルタかけるわけだから、FIRは不要じゃね?
大抵の場合
>>942 の手順で事足りると思う。
多分フーリエ変換が解ってないんだと思うからFFTのC言語ソースとか落としてsin/cos波形食わしてみ。
http://www.google.co.jp/search?q=fft.c
944 :
940 :2008/11/21(金) 17:30:04
FFTした結果からピークの山を見つけるにはどういうプログラムを書けばいいですか? 実際の値を 横軸を対数に周波数、縦軸にパワーにとったグラフにプロットして目で見ればここが山かなと わかるんですが・・・
Audacityのスペクトル表示にあるような機能です。
948 :
940 :2008/11/22(土) 00:54:01
指摘はメールでお願いしますとreadmeで書きましたが、 このスレでしていただいても結構です。人頼みで申し訳ありません
周波数と振幅からどうやって音量を求めるんですか?
もしかして:RMS+二条平均根
変換ミス... 二乗平均根
固定小数点演算のフィルタを作りたいのですが係数の小数点位置はどのようにして決めればいいんでしょうか
>>952 用途によるとしか言いようが。
昔自分が作ったのだと、IIRだと整数部2ビット、FIRだと整数部なしでやった。
符号部1bit,整数部2bit,残りを少数部ですかね 乗算した結果が精度的に2倍なると思うのですが、元の精度に戻すことを考えると頭がこんがらがってしまって・・・ そのあたりはどうすればいいんでしょうか
>>954 そんなとこ>符号1bit、整数部2bit。
普通は係数とバッファで固定小数点位置変えるからなぁ。
たいてい、フィルタ係数って1以下になるでしょ。
956 :
デフォルトの名無しさん :2008/11/30(日) 23:22:25
モノラル音響信号を、2次元フーリエ変換成分(周波数方向のフーリエ成分と時間方向のフーリエ成分) に分けることって可能ですか?そのあたりについて詳しいサイトとか本とか知ってたら教えていただきたいです。
>>956 それ、ウェーブレットで検索した方がいいかも。
係数は確かに大抵1以下なんですが、ところどころ1以上になるところが出来てしまって・・・ もしバッファの小数点位置がLSBにあって、係数を符号部1bit,整数部2bit,小数部5bitとした場合は乗算した結果を5bit右シフトして整数部を残すようにするんでしょうか この方法だと係数が1以上の場合、残した整数部データの有効なビット幅がバッファに入ってるものより大きくなってしまう気がして・・・
>>956 スペクトログラムのことを言っているなら短時間FFT
ここで聞くのがいいのか少々悩ましいのだが AMDーSB700でレガシオーディオの設定はどこのポートを叩けばいいのか情報ないかい? 非Windows環境なんだが、奴が邪魔してYMF744のFM音源鳴らすのに不便で仕方が無い。
961 :
デフォルトの名無しさん :2008/12/02(火) 00:09:48
DTMFのトーン信号を解析するソフトについて、ソースとかから載ってる本とかwebPageとか ご存じありませんか? #出来ればVC++で。
>>962 ありがとう。ただ、俺が探してるのは外部装置なしでPC内で完結してるやつなんだ。
サウンドカードから取り込んで、判別&表示、みたいな。
スペクトラムってどうやって計算するんですか?
FFTして複素平面上でベクトルの絶対値
THX!
リサンプリング周波数の組み合わせによっては処理量が膨大になる問題で 例えば48k→44.1kで↑147↓160を素因数分解して複数回処理にわければ、 重い(ほぼ)理想フィルタでも使える!売れる! とか思って実装してみたらVoxengoに年単位で先を越されていたというチラ裏。 (ちなみに処理量は1/7〜1/8になります。 ほぼ理想フィルタなので数回程度なら聴取可能な影響はない)
>>968 分かる奴だけ分かってくれ…ってのはアレなので、
↑がインターポレーション
↓がデシメーション
間にLPFが入る
っていうサンプルレート変換のやり方の話。DSP使わない場合は
計算負荷と品質のトレードオフになる。あとはてきとうに調べて。
970 :
デフォルトの名無しさん :2008/12/15(月) 04:43:01
勘違いしてるかもしれんから教えて欲しいんだけど、 一次元信号で8000のデータ数があったとして、それをレベル3までのウェーブレット変換をしたら、 0〜2000までがレベル3のスケーリング係数で、 2000〜4000までがレベル3のウェーブレット係数で、 4000〜6000までがレベル2のウェーブレット係数で、 6000〜8000までがレベル1のウェーブレット係数って認識であってるかな?
実装次第
そりゃそうだ
http://limetarte.net/software/more/binary/VocalReducer.htm ここのボーカルキャンセラーなんだけどアルゴリズムについてわかる人いますか?
・新ボーカルキャンセラ(周波数成分分解ベクトル減算型=イミディエイト法)
L, R チャネルをそれぞれ フーリエ変換、ハートレー変換などで
{Li},{Ri} のように周波数ごとの成分に分離します。
ここで、両チャネルの振幅スペクトル・位相スペクトルを比較し、
非常に近いもののみを、重み付け係数付きでベクトル減算します。
これを逆変換すると、中央音の消えたステレオ音源を得ることが
できます。
LとRのパワースペクトルを比較して、 パワーが似てる周波数ビンのパワーを0とかにすればいいのかな?
作者に聞けっていわれそうですが・・・返信がなかったんで
位相も考えないとだめじゃないの
まぁ普通この手のアルゴリズムは説明してくんねぇって。 何の用途で使うかしんないけど、そのまま製品化とかされたらたまんないし、 どっかのサブマリン特許に引っかかってる可能性もあるし、メリットねぇもん。
フーリエ変換が分かれば高校数学でできる。 複素スペクトル平面上にOLとORを書いて、 PLとPRが直交するようなOPを適当に作ってベクトル減算。 習った次の日くらいに思いついたぞ俺。 ブロック単位の処理の場合プリエコーポストエコーの問題もあるから、 上みたいな遊びソフトはともかく、音楽制作に供するなら ちょっとは頑張らないと音質的に微妙になるけど。
はいはい(笑)
おまえらその説明で分かんないのか……
こういううざいのってどこにもいるのね
うめ
>>978 t = arange(0, 50, 0.01)
x = exp(-t/10)*cos(t)
y = exp(-t/10)*sin(t)
z = t