落ちていたので立てました。
テンプレ等はお願いします。
用語を統一するために
リアルタイム
バッチ処理の対語で、ゼロレイテンシの事ではない。
遅延はあっても途切れずに処理する事をいう
レイテンシ
ADCからDACまでにかかる時間の事だったり
DSPの掛け算なんかで命令から実際に答えが出るまでの命令サイクル数の事だったり
DSP
デジタル・シグナル・プロセッサ の場合は信号処理用のMPUの事
デジタル信号処理の事を言う場合もある
SONYのACID MUSIC STUDIOとかいうやつのテンポを変えても音の高さが変わらないのはすごいと思う
ループサウンドを組み合わせるだけで作曲できるソフトなんだが、テンポを変えてもループサウンドの音の高さが変わらない
ループサウンドの本体はただのWAVEファイルっぽい
普通はテンポ変えたら、早送りとかスローみたい音の高さが変わるけど、これは変わらない
しかもアナログに近いレベルに細かくテンポを変えられる
一体どういう処理してるんだろうな
周波数を増やせばいいだけだろ。
引き伸ばすのではなくバッファだけ増やして
増やした分だけ元のバッファからコピペすればいい。
サウンドプログラミングて良くわからんね
検索しづらいし、音声処理じゃダメなの?それとも別物?
ノイズ除去ってどうやるの?
MCI使ってWAVEとして録音したデータからノイズを除去したい
>>9
サーーーーーーって音
>>10
フーリエ変換か・・・
大学の講義でちょろっと習っただけだがやってみるか
ありがと >>5-6
例えば、4Hzなら、1秒間に波形、abcd と鳴るとき、
テンポを半分にすると、2秒間で、aabb, ccdd と、
1オクターブ低く聞こえる(2Hz)
これを2秒間で、abcd, abcd とすれば、
長さが倍になっても、4Hzのまま
>>8
audacity を使えば? 例えばabcdが「ド」の音だとすると、abcd abcdにしたら「ドド」と2回聞こえるだろ
それにテンポをそんなにキリのいい数字で変えることなんてないだろ
ハゲ
>>5
VLCも確かそんな感じ
オープンソースだった気がするけど ( ´・ω) (´・ω・) (╯•﹏•╰) (・ω・`) (ω・` )
シグナルを周波数成分ごとに分解したい時は通常FFTを用いると思いますが
既成のソフトでは周波数分解能と時間分解能はトレードオフにある物が大半です
周波数分解能も時間分解能も欲しい場合に使えそうなアルゴリズムもしくは
そのような機能を持ったライブラリ的な物はあるのでしょうか?
たとえばレベルの低い「プチッ」みたいなノイズを既成のソフトのFFT機能で
見つけようとしても困難なのでそういうツールを作れないかなと・・・
>>20
周波数分解能と時間分解能は原理的に表裏一体じゃないの >>20
ウェーブレット変換は試してみた?
あまり経験はないので突っ込んだことは言えないけど リアルタイムで録音しつつノイズ除去するとやっぱ重い?
パソコンのスペックや録音する周波数、ノイズ除去のやり方によるとかそういう揚げ足取りレスはいらないよ。
アプリをクロスプラットフォームにするために
OpenALでプログラミングしてるが
仕様がよく分からない部分があって苦戦
どうやら使用中のバッファは削除できない仕様のようだ
エイリアスノイズってオーバーサンプリングしてLPF掛けるしかない?
それとも保管してからLPFかけても出来るの?
ノイズの周波数が必要な周波数より低ければ取れると思うけど。
「エイリアスノイズ」の意味を取り違っているなんて事はないですよね。
てか>>26が何を言ってるのか分からないから誰もまともに返答できない
既にエイリアスノイズが乗ってる信号をどうにかしたいという話なら
ノイズが必要な帯域外にあることが分かってるならLPFやHPFやBPFでなんとか出来るかもしれないけど ものすごく初歩的で原始的な質問ですが、
2つのPCMデータ(A,B)をミックスして1つのPCMデータ(C)にするとき
上限下限を超えないように処理するには、平均を取ればいいのですか?
それだと、PCMデータ(C)を鳴らしたときに聞こえるPCMデータ(A)の音は
PCMデータ(A)を単体で鳴らしたときの半分の音量になってしまわないでしょうか?
PCMデータ(B)が仮にほぼ無音に近いものだったとしたら、ミックスすることで音量が半分になるのはおかしくないでしょうか?
>>30
レスありがとうございます
実際のところ、一音毎にサンプリングされたピアノの音(88個)をシーケンス情報を元にミックスしてPCMデータ化したいと思っています。
一音一音の振幅の最大は70%くらいなので、数音混ぜるだけでかなり頻繁に飽和が発生し、時には100%張り付きの状態が発生し、とても聴くに堪えない音になりそうです。
二つあるいは複数の音を混ぜるという単純な処理でも、コンプレッションの概念が必要になってくるものなのでしょうか?
または、サンプリングの時点でレベルをかなり抑え目にしておいて、上限を超える頻度が常識的な演奏であれば少なくなるようにバランスを取ることで妥協するのでしょうか?
もっと何か根本的に間違っているのでしょうか? >>29
複数の音を混ぜるだけなら普通に加算と飽和処理でいいと思うよ。
ピアノのサンプルは大きい音で録音しておいて、ミックスするときに
1音あたりの音量を下げる。
1音あたりの振幅はもっとも大きい音(MIDIだとVelocityが127)でも
最大の8~10%程度にしてみたらどうかな?
ピアノだったらもっとも音量の大きい弾いた瞬間が10音以上重なることはまずないから
飽和することはほとんどないと思う。 クリッピングでいいよ。
この場合はオーバーフローを起こさないように処理するだけ
>>32
なるほど具体的な回答ありがとうございます。
最大10音重なる想定であれば一つあたりは10%程度にするものなんですね。
なんとなくリアルのピアノでの一音と同じ強さで弾いた10音が10倍の音量になっているようには聞こえないかなと思ったのと、
かと言って10音で弾いた内の1音が、単音の場合より小さく聞こえるわけでもない気がするので、
音が混ざるとはどういう現象なのかわからなくなった次第です。 そのへんは振幅と音量(音圧レベル)の関係あたりを調べるとわかってくると思う。
>>34
そうですか。
単なるクリッピング処理の事に飽和演算なんていう専門用語があったのが驚いた。 CPUで32倍以上のオーバーサンプリング処理するとむちゃくちゃ重いんですが、
CUDAでやったら劇的に軽くなったりしますか?
「CPUでオーバーサンプリング処理」が意味不明
アップサンプリングのことか?
だから意味不明なんだが
どうやって「CPUで」オーバーサンプリングするんだよ?
はあ?
「CPUでオーバーサンプリング」の具体的な意味を少しは言ってみろよ
キモイ顔文字野郎
はいはいオーバーサンプリングの意味すら知らないということは良く分かったよ
もったいぶることしかできないクズ野郎
答えもしないくせに他人のこと暴言吐くことしかしない変な奴w
しかも元の質問者そっちのけ
何言ってるんだこの糞ボケ
答えもしないで因縁だけ付けてるのはお前だよ
俺は「CPUでオーバーサンプリング」の意味を確かめてるだけだよ
それがはっきりしないと答えようもないからね
厳密な意味を求めるのもわかるけど、相手のレベルが分からない以上
質問の内容をある程度の推測も必要だと思う。
それはさておき…
音声処理に詳しくないから一般的なところだけど、
「むちゃくちゃ重い」の原因は何だろう?どんなアルゴリズムなんだろう?
って思った。
むちゃくちゃ重い、が何と比較して重いのかも全く分からない
本当に申し訳ないのですがそのままの意味です
GPGPU・FPGAの音声処理に詳しい方もいらっしゃらないようですので以後スルーでお願いします<m(__)m>
あらあら
で結局アップサンプリングのことなんだろ?
マルチレートフィルタをちゃんと勉強しないと何でやろうがダメだろうな
どうせフィルタの効率的な作り方なんて全く知らなくて
大きな係数のフィルタを古い教科書通りの時間領域の積和処理で作ってるとかだろ
この手の処理がFPGAで早くなるなんてことはないし、GPGPUでも一緒
殆どメモリアクセスがネックなんだから
>>44
いやサンプリング済みのデータに対してCPUでオーバーサンプリングすることは可能だが
その場合の意味はアップサンプリングの前段処理に他ならない >>54
輪をかけて意味不明なこと言ってどうする?
「サンプリング済みのデータに対してCPUで」
それは「アップサンプリング」「補間」とかもっと一般的には「サンプリング周波数変換(N/M)」と呼ばれるものだから。
オーバーサンプリングというのはな、ADCやDACについて言われることで、
サンプリング周波数を、扱う信号の最高周波数×2より高くすることだ。
特別なことがない限りCPUで行うものではない。 アナログフィルターって無限まで周波数があるし
デジタルがいくらオーバーサンプリングしてもかてるわけないしな
オッサン世代の俺は、ソフトシンセの進化の物凄さに、
卒倒する思いだわw
CPUの処理速度が代わってないのに進化する訳ないじゃん。
逆に耳が慣れたんだと思うな。
いや。大昔、PCMからFM音源に移行した際、感動したくらいの
オッサン年齢だからね。
リアルタイムのシンセシスやウェーブシェーピングは10年前くらいと処理速度ほとんどかわんないね
ムーアの法則なにそれおいしいのって感じ
なんちゃってリズムマシンをプログラミング中
割と楽しいっす
サウンド処理によく使われるファンクションを詰め合わせたライブラリってありませんか?
グラフィック処理で言えばImageMagickやOpenCVみたいなものです
出来れば日本語の情報が充実していると助かります
単純な加減乗除ならともかくFFT変換やWavelet変換などの周波数分解/合成を伴う処理を
実用になるレベルでコーディングするのは自分には荷が重いです
というかAudacityのNyquistで実現できないかと調べていたのですが複数のトラックの情報を
元に処理して出力を得る方法が見つけられず、他のDAWアプリケーションにもそのような処理が
出来るような物はないようで、自分で作るしかなさそうです・・・
SuperCollider, Pure Data, Chuck, Csound の話題はスレ違い?
アップサンプリングに関してですが
直線位相FIRのインターポーレーションフィルタをかける場合
適切なタップ長と窓関数が纏まっているページはありませんか?
もしくはもっと技巧を凝らさないと
元波形と完全に一致するレベルにはならない、とか、何かあります?
今のところ128倍とか、高いアップサンプリングは割と精度が出るんですが
むしろ、4倍とかそこいらの低めのアップサンプリングで精度が出なくて困っています
「適切な」とは何かわからないけど
とにかく理想的になればいいというのであれば、可能な限りタップ長を長くすればいい
ただしビット深度もそれなりに高くないと意味がなくなる
まずそれがうまくいってないなら、どこかに間違いがあるか、うまく計算できていない箇所がある
タップ長が限られるなら窓関数によって主に、フィルタの切れ味とストップバンドの低さのトレードオフになる
そもそも直線位相だからと言って波形が全く一致することになるわけではない
(完全に一致するということは、折り返し成分も再現されたようなもの、これもどの程度のことを言ってるのかわからないけど)
返信ありがとう
今のところ完璧といってよいぐらいの精度、(24bitの分解能以下の誤差)は出てるんですが
なぜか音は悪いです
テストの方法は、適当な波形を用意して、それを間引いて
(というか間引きたいところをゼロにして)
それにインターポーレーションをかけて得られた結果を
元の波形と比べてどれぐらい一致しているかを判断しています
このテストではかなりうまくいっているのに
実際の音楽をアップサンプリングするとあまり音がよくなくて困っています
タップ長は2倍のアップサンプリングでしたら33タップです
アップサンプリングの倍率*8*2+1、で計算しています
窓関数は160dBのカイザー窓です
いろいろ試したらこれが一番精度が良さげだったのでそうしています
アップサンプリングで補間されたとこは元データに存在しないと思うけど、
誤差がほとんどないってのはそこを除いた部分に関してだよね?
そうなら、聞いた感じが違うのはあり得るんじゃない?
>>69
まず33タップはオーディオ信号処理としては短いと思いますよ(遅延があると困る場合は仕方ないけど)
sinc関数のどこ(の振幅レベル)で切られることになるか確認してみましょう
それに-160dBまで押さえ込もうとしているんだとしたら相当緩いフィルタになってると思いますよ
出来上がった33タップの係数から周波数特性を確認してみましょう
かなりカットオフ周波数を下げないと折り返しが漏れまくりだと思います
(z関数の式で確認すればビット深度の影響を除外できます)
それに24bitは144dBしかDレンジないですよ(floatingだったとしても)
カイザーのβを欲張りすぎだと思います
窓関数の端の方がほとんど0になってませんか?(floatでもあまりに小さい値になってると積和する時に捨てられることになります) >>70
いえいえ、誤差がほとんどないというのは
適当な信号を間引いてダウンサンプリングして
もう一度アップサンプリングしたものと
もともとの波形を比べると、ほぼ差が出ないという意味です
>>71
計算自体はdoubleでやってまして
24bitの分解能以下の誤差、と言いましたのは
最終的なデバイスへの出力が24bitになるので
その分解能以下の誤差であれば問題なかろう、という意味でした >>72
ダウンサンプル前のデータに含まれる周波数は、
ダウンサンプリング後のナイキスト周波数以下のみだよね?
そうなら、
>>71の言うようにフィルタが甘くて、
アップサンプリング時のゼロ埋めで生じた高周波を適切にカットできてないぐらいしか思い付かないな。 質問者ですが、良い情報を見つけました
>http://ascii.jp/elem/000/001/130/1130242/
>「普通のDAC ICは100タップで、8倍か16倍のオーバーサンプリング」
ということらしいので、私がテストを繰り返して適当に求めた
「アップサンプリングの倍率*8*2+1」
という適当な数式は割と妥当みたいです
あとは160dBという窓関数がきつすぎるとか、そういうのはありそうです
でもテストすると、計算上は160dBが一番精度が良いんですよねぇ
なぜ音が悪くなるのかは結局謎でして
もうちょっといろいろ試してみたいと思います あと、あり得るとしたら
「アップサンプリングの倍率*8*2+1」で計算したタップ数は
一般的なDACが内部で行っているアップサンプリングとくらべて
ちょっとタップ数が多い、のかもしれませぬ
そのため、カイザー窓を深く(160dB)かけたときに精度が高まっているのかも
なのでタップ数を減らして窓関数を浅くする実験もしてみないとダメかもしれません
どうせ最終的な出力は24bitなので、必要以上の精度は要らないですし
タップ数が増えることでプリエコーも増えるので
この辺が音質に関係している可能性もあるかもです
>>74
たぶんタップ数とフィルタの時間長を混同してらっしゃるかと・・・
それに今時は100でも少ない方かと・・・
DAC ICではさらにその後の処理もあります
精度の出し方が怪しいと思います・・・
カットオフ周波数の話が出てこないのも怪しいです・・・ >>75
>一般的なDACが内部で行っているアップサンプリングとくらべてちょっとタップ数が多い、のかもしれませぬ
逆です
>そのため、カイザー窓を深く(160dB)かけたときに精度が高まっているのかも
逆です
>どうせ最終的な出力は24bitなので、必要以上の精度は要らないですし
正論です
>タップ数が増えることでプリエコーも増えるので
あまり関係ないです
(でかい波は中央付近にいるので)
そのプリエコーでも特性が作られていることを忘れずに
気になるなら最小位相など他のタイプへ
(もっとタップ長が必要になるが) ノイズシェーピングについてどなたか教えて下さい。
以下は3次のノイズシェーピングを行っているつもりです。
http://ameblo.jp/etsuo-okuda/image-10477341542-10444025802.html
を参考にしました。
考え方は正しいでしょうか?出力結果は高域になるにつれて周波数成分が増えています。
また、これ以上に次数を増やしたいのですが、★の行をどのように変更すべきでしょうか?
Visual Basic 2015
Class Test
Private Diff(2) As Int64
Function To24_NoiseShaping(ByVal V As Int64) As Integer
Dim I24 As Integer
V += Diff(0) * 3 - Diff(1) * 3 + Diff(2) '★
I24 = V >> 40
Diff(2) = Diff(1)
Diff(1) = Diff(0)
Diff(0) = V - (CLng(I24) << 40)
Return I24
End Function
End Class >>80
の訂正です。
×以下は3次のノイズシェーピングを行っているつもりです。
○以下のコードは3次のノイズシェーピングを行っているつもりです。
「以下」がリンク先を表しているように読めてしまうので訂正いたします。 今日は朝からBraunのシェーバーのCMばかりでうざいと思ったら
9日でシリーズ9の販促特異日のようだ
みんな自分の作ったプログラムの動作確認ってどういう風にしてる?
サウンドプログラミング興味あるんだけど、デスクトップ上で作ったプログラム
動かしてみたい
最終的にはマイコンに移植して使うからC++で書くことを前提としてる。
VSTiがいいかなと思ったけど、GUI作るのがめんどくさそうなんだよね
音の処理そのものに関することではなくメタデータに関する質問なのですが・・・
タイアップ曲があったとしてそのタグにOPとかEDとか挿入歌(1バイト文字表記でどのように書くのが適当なのか不明)などの
使用箇所を入れたいのですがこのフィールドのキーの名前として標準的な物はありますか?
いまのところVorbisCommentとAPEv2での使用を考えています
>>89
うまく行ったら革つけてシンセ作りたいとか言う妄想。
でも、能力なさ過ぎてマジで何やってるのかさっぱりわからん。 サンプルサイズ8bitってファミコン音のイメージしか無かったけど
実際16bitの音楽ファイルを8bitに落としてみたら以外に聴ける音だね
これで安心して8bitで出力するプログラムが書けるよ
デサンプラーの性能とかあるからね。
ファミコンは、絵とかプログラムとかまるっと揃ってあの形だから音に割けるリソースは少ない。
時代も時代だから、品質も微妙だし。
ところでお前ら、>>88については意見をくれないのかね。
マジで何やってるのかわからないから開発止まってる。 それもそうだな。
自分でコーディングしといてあれだが、以下のパラメータの意味がよくわかってない。
A*Fun1(InitA*Time + B*Fun2(InitB*Time));
勝手に推論してそんなもんだろうと思ってるけど、あってる気がしない。
たすけて、プリーズ。
>>96
そうなんだけど、どのパラメータいじったらどういう効果かわかってないというか。
取り留めなくてすまない。 Yes!!Yes!!Yes!!Yes!!Yes!!Orz
間違ってこのスレ開いたら,>>88にコードがおいてあるじゃないか
雑談が多い板でそれなりのコードがおいてあるスレって珍しいな。
>>88
なにをやっているかわからないのにコードを書けるってすごいな
俺もコードは読めるが、何をしているんだ?って感じだが >>102
識者現る。
最初は、パルスジェネレータ書こうと思ってパルスジェネレータ書いて、
FMのDTM版開いたらなんかウィキペディアのリンク張ってあるからパクるつもりで書いた。
数式を推論でコードに落としただけだから。しかし、俺には高度すぎた。そもそも文系だしな。
違和感があるならぜひ教えてほしい。 コード書けるひとを見つけたとき
自分もそうなりたい ← がんがれ
どうやったらそうなれるの? ← 金払え
自分には無理 ← さっさとやめれば?
このパターンしかない
プログラムコピペして、何これ意味わからん、一から教えれと言われてもムリですマル
>>88だけど、叩きネタになってきたからもういいよ。
開発やめるわ。 FM変調なんて出る音は想像しにくいけどアルゴリズムは超シンプル
何がわからないのかわからないし
他人にタダでプログラム読ませてレビューさせようとする態度じゃ開発やめた方がいいよ
自分のメモも含めて
離散フーリエ変換(DFT/FFT)や離散ウェーブレット変換(DWT)を実装したいけどググっても
数式が列挙されているような記事ばかりで高卒の自分にはさっぱり判らん
出来れば時間情報を残したいので最終的にはDWTの実装が目標
数式がずらずらより抽象化された資料や最低限の実装例が欲しいけどなかなか見つからない
DFT/FFT
理論からのアプローチ
小学生に教えるフーリエ変換 - researchmap
http://researchmap.jp/jow16lae8-617/
見つけられた中では最も抽象化されている資料。ただし抽象的すぎるのか装に結びつけられん・・・
PIC AVR 工作室 FFTの計算と複素数の入門
http://picavr.uunyan.com/warehouse_fft.html
高校生相当に抽象化されているもよう。が、ベクトルの合成・分解は今までにやった記憶があるけど
ベクトルの内積とか複素数とか全く記憶にない・・・多分必須しか取っていないせいだな
でもこれを理解出来ればFFTを実装できそうな気はする。積分式?がずらずらよりは遙かに良い
実装からのアプローチ
FFTの扱い方 - ロジカルアーツ研究所
http://www.logical-arts.jp/?p=112
FFTライブラリの入出力について解説されている記事。これを読めば何となく使えそうな感じ
Ruby で FFT (高速フーリエ変換) を書いてみた - まめめも
http://d.hatena.ne.jp/ku-ma-me/20111124/p1
Ruby的な書き方をしている上に再帰呼び出しをしているとはいえ驚異的に短い。これ、あっているのか?
正しいなら理解を助ける一助になりそう(自分はRubyメインだし)
参考元のコードも比較的コンパクトに書かれている
DWT
めぼしい資料は未発見
窓関数
未着手 フーリエ変換後にやりたいことに合わせて処理を簡略化するんだよ
律儀にやる必要はない
flacフォーマットの質問をしたいんだけど、スレチなら誘導してくれ。
https://xiph.org/flac/format.html
https://xiph.org/flac/api/index.html
ここらを見て構造を調べてるんだけど、いまいち分からん。
METADATA_BLOCK の APPLICATION と CUESHEET および PADDING は、
ひとつのflacファイルに複数あっても良いのだろうか、それとも、
あるなら1個のみだろうか。
というのも、他のブロックはドキュメントに明確に数が示されている。
・STREAMINFO 必ず1個
・SEEKTABLE 0個か1個
・VORBIS_COMMENT 0個か1個
・PICTURE 0個以上
しかし、先の3つのブロックについては明記されていない。
何となく CUESHEET は役割的にあるなら1個のみのような気がするが・・・
どうなんだろ? >>113
一般的な回答になっちゃうけどそれらの親はMETADATA_BLOCK_DATAだよね
METADATA_BLOCK_DATAの存在可能個数に依存するんじゃないかな
あと明記されていない以上どう扱うかは“実装による”と言うオチが付きそうな気がしなくもない
タグだって標準的ではない情報を入れようと思ったらそれっぽい名前のフィールドをでっち上げるしかないわけだし >>114
ありがと。
メタデータの個数は、ドキュメントには
STREAM
<32> マーカー
METADATA_BLOCK ストリームインフォのため
METADATA_BLOCK* その他のメタデータのため
FRAME+
としか書かれていないから、これに従えば上限は無い。
いくらでも加えられる事になる。
もしかして俺がドキュメントや API を見落としているかもと思ってたから、
実装によることが確かなら、それでいいんだ。
俺が作ったライターが書き出したflacファイルを他人が作ったリーダーで読み込んだ時、
たとえば PADDING が複数あっても、実装依存なら、それをリーダーにどう扱われようが、
少なくともエラーにはならない(解釈しないメタデータは無視するのが仕様)。
でもドキュメントや API から、それは「複数あってはダメ」なことが仕様だと読み取れるのなら、
厳密に正しく作られたリーダーにflacファイルではないと解釈されてしまう。
俺が作ったライターは仕様に則っていない糞プログラムといことになる。
それは避けたい(まぁ実際に PADDING を複数作ることは無いが、例として挙げた)。 何をしたいのかわからんけど
APPLICATION:サードパーティーアプリに対し付与される保証ID
CUESHEET:内部埋め込みキューシート
PADDING:余白
てあるから、必須ではないと思うけど
>>116
仕様としては、それらが0個以上あることが許されているのか、
多くても1個までなのか、が知りたかった。
で、一般論としては、ドキュメントに明記されてなきゃ実装依存だろ、
とのアドバイスをもらったたころ。 >>115
結局何を優先したいのかが重要じゃないかな?仕様に忠実だからといって最大の互換性を得られるとは限らない
仕様上は問題ないけどイレギュラーな構造や値の入ったデータはそれだけで互換性の問題を起こしやすいよね
互換性最大だったら公式ツールが吐くデータに添うのが現実的では。一般的にそれらは1ファイルに付き1つだよな? >>118
何を優先したいかじゃなくて、まずは仕様を正しく知りたい。
正しく知った上で、じゃあ互換性を優先しようかどうかと考えるんだけど、
それは仕様を知ることとは別問題でしょ。
互換性を優先するのが目的ならば仕様を正しく知る必要はない、
なんてことは無いと思うんだよ。 仕様がないと困る人はRubyとか使えないんだろうなぁ。Rubyは仕様が存在しない言語だしな
PCMデータから特定の音(倍音も含む)のみを抽出・抑制したいのでPCMデータとパラメータ(周波数とゲインのセットが多数)を
入力するとパターンに従ってPCMデータを加工してくれるEQライブラリ的なのってありませんかね?
パラメータは処理中に変化していくため既成のソフトウェアでは対応できそうにないので自作を考えています
パラメータの与え型は
http://alphamanual.audacityteam.org/man/Equalization
みたいな感じをイメージしています。倍音を抽出する場合は方形波状に沢山窓を並べることになると思います DFTで特定の周波数だけ計算してしまえばいい。
位相も一緒に計算しておいて逆位相を加えれば消えてくれる
>>126
スマン、何を言いたいのか判らん
DFTというかFFTして該当周波数だけ取り出して、位相を180度回転したものをIFFTして加算合成ってこと? 今は自作のフィードバック型コムフィルターで実験していますが、強く掛けようとすると通過する帯域が狭くなるためか
ケロってしまうので通過させる帯域を調整出来るようにしたいです
>>128
DFTって時間&振幅を周波数&振幅&位相に変換する処理だよね?特定の周波数だけDFTってどういう事? DTFなんて持ち出さなくてもIIRで作ったLPF/HPF/BPFなどを組み合わせるのではダメなのか?
一般的にその手のアプリケーションに搭載されているエフェクターってそうやって作られていたような
DFTがらみは良く判らないので
http://vstcpp.wpblog.jp/?page_id=523
を参考にBFPを組んで実験
同じホワイトノイズに対して通過させる目標の周波数を440Hzとして処理した結果
上から自作BPF、自作CombFilter(freedback型)、AudacityのEQ
自作BPFのスペクトル
自作CombFilterのスペクトル
AudacityのEQのスペクトル
EQに与えたパラメータ
自作BPF
通過させる窓は基準周波数から16KHz未満まで用意
通過特性がフラットでない。簡単に補正しているけど十分ではない。減衰し切れていない信号まで加算してしまっているため?
通過させる窓1つに付きBPFを1つ用意して出力値を加算しているためクソ重い(440HzだとBPFは30個以上になる)
自作BPFと自作CombFilterの課題
通過させる帯域と広くしようとすると谷を深くできない
AudacityのEQ
通過させる窓は基準周波数から16KHz未満まで用意
与えたパラメータほどの特性は得られていないけどスペクトルを見た感じでは良さそう
パラメータを動的に変更できない
BPFを沢山使う方法は特性がイマイチな割に重いので筋が良くなさそう
CombFilterで谷を深くしたまま通過帯域を広くできれば軽いし一番良さそうだけどそんなことは不可能か?
AudacityのEQ的なフィルターを作れればいいけど作り方が判らない
うーむ、手詰まりか・・・
>>130
ググっても使用例とか全然出てこないので良く判らないんだけど
FFTは取り得る全ての周波数について計算するけど、その中の一部の周波数だけ計算するって話? >>129
一部だけ計算するという理解でOK
DFTもFFTも波形の周波数特性(振幅+位相)が得られる。
DFTフーリエ変換の定義式どうり計算するだけ
あとはサンプリング分解能(サンプリング周波数÷サンプリング数)を上手く選べば所望の値が精度よく得られる >>133
少しイメージできた、ありがとう。DFTを使って一部を抜き出すとしたら目標とする周波数の付近のみ
DFT結果に相当する波形を生成しそれらを合成するという手順でいいのかな?
ただしDFTだとどうであれある程度の時間分を計算をする必要がありますよね
原理的に周波数分解能と時間分解能の両立はできないと思っているのですが何か改善策はあるのでしょうか?
昔別件でFFTの使用を検討したことがありますが上記の課題を解決できずに棚上げになっています >>134
>原理的に周波数分解能と時間分解能の両立はできない
そうだよ >>135
いやいや横割で何言ってんの?
どうせ不確定性定理のことを言ってると思うけど窓フーリエも何もやってない。周波数一点狙い縛りのときは格段に精度がよくなることを知らないな?
>>134
FFTと違ってのサンプル数2^n縛りみたいな制約が無いんだよね。だから周波数分解能の選択に自由度がある。
あとはDFTの計算さえ間違わなければ、所望の値が求まる。計算コストはNオーダー。 例えば1000Hzの音を拾いたいとき、周波数分解能が19Hzだったりすると1000Hzが正確に拾えない。周波数特性をグラフにプロットすると、1000を中心にして根元周辺に連続的な山ができる。
周波数分解能が1000の約数だと、周波数特性グラフは根元の山はなく、一点だけのピークができる
自分の中での整理もかねて・・・また長くなってすみません
話の発端
この中から必要な音だけを抽出したい
このサンプルは音声ですが必ずしも音声とは限らないです、楽器音の消去・修正なども考えています
オレンジ色の線が基準と思われる周波数を線引きした物です
音声の場合は倍音も必要なのでこの周波数で櫛歯状のフィルターを駆動すれば欲しい音だけ得られるのではないかと考えた
簡単に櫛歯状の通過特性を得られるFeedback型のCombFilterを組んで実験してみたのが>>129の時点
ただし強く掛けるとケロってしまい満足のいく品質には届かず
その原因を推測
1.通過する帯域が狭すぎる?
2.実際の周波数とフィルターを駆動している周波数にズレがある?
3.フォルマントを無視しているせい?
1 これを解決しようと思ったらDAWなどに付いてくる通過周波数と減衰量を自在に設定出来るEQ的な物を用意するしかない?(が、作り方が判らない)
2 この手の解析には通常FFTを用いるけど原理的に周波数、時間ともに少なからぬ誤差が発生する。解決法はない?
3 通過周波数を自在に設定出来るEQ的な物がないと検証すら出来ないのでとりあえず棚上げ。規則的なフィルタを使う限りは解決不可
もう少し細かく制御できそうなBPFでやってみたのが>>132。予想に反してイマイチでボツ
で、現状手詰まり中・・・BEFで間を抑制してみる?ただし帯域と抑制量を個別に制御できないと上手くいかなそうな気がするし作り方も判らない
>>136-137
DFTについて理解が乏しいので変なことを言っていたらすみません
処理する信号が1KHzでサンプル長に1msecかその倍数を選択して1KHzを目標にDFTする?と1KHzに相当する振幅と位相が高い選択度で得られるって話ですよね?
シグナルジェネレータで1秒の1KHzの信号を作ってそれに対して1KHzを目標として処理するならばそのようなことも可能だと思いますが
人工的に処理に都合の良い信号を作らないかぎりそのような状況はまず無いと思うのですが・・・
現実には関連する要素に少なからぬ誤差が含まれていると思われますし .NET Frameworkで使用可能なALAC形式を読み書きできるライブラリを
ご存知ないでしょうか?
16-32bit/44.1-384kHzに対応しているものが希望なのですが。
>>140
ありがとう。
デコードはできそうな気がするけど、エンコードはできないように見える。 >>140
残念ながら24bitまでで32bitには対応していませんでした。 元はjavaみたいだな、javaも同じ仕様なんかな
>>140
ALAC.NET自体は24bitまでしか対応していませんが、修正して32bit Integerに対応させる事ができそうです。
refalac.exeでエンコードした32/352.4をデコードしてバイナリ一致する事が確認できました。
ありがとうございました! 音の加工についてプログラムの観点から理論で解説してある書籍かサイトないですか?
例えば、何をどうすればエコーがかかるとか、何をどうすればライブ会場みたいな響きになるとか。
PCMを加工する形で遊んでみたいのですが、とっかかりがなくて困っています。
プログラミングに関してはメジャーな言語を数種類自在に使える職業エンジニアなので大丈夫です。
//スマホのアプリで、普通の音楽をライブ会場風に加工して再生してくれるやつありましたよね。
//あれには大変驚いたとともに、知識があればこんなものが作れるのかと感動し、自分も何か作れないものかと思いました。
「サウンドエフェクト プログラミング」でググると、理論解説した書籍やプログラミング方法を解説したサイトが出てくる
漏れは、YouTube みたいに、再生速度が速くなったり遅くなったりするのに、
音程が上下せず、一定にできる秘密を知りたい
秘密もクソもあるかい
CDだって早送りしてもピッチは変わらないだろ
アナログみたいに周波数を上げるのではなくて、データを適当に間引くだけだし
データ間引いて再生したらピッチ上がって聴こえるんじゃないの?
データを間引くというのは、要するにサンプリングレートを落とす(ダウンサンプリング)ということですよね?
1000Hzのサイン波を倍速再生する場合で考えると、
1秒間で1000個あるサイン波を(1周期で1個と数えたとして)
アナログの場合は、物理的な速度アップの操作(レコード盤なら回転を速めるとか)によって
0.5秒間で1000個分を再生する = 2000Hz
CDの早送りの場合は、1000個の内、例えば100番台(100~199),300番台,500番台,700番台,900番台を間引いて詰めるような感じ(飛び飛びで再生する)
0.5秒間で500個なので1000Hz、ピッチは変わらない
Youtubeなども同様。ピッチが変わらないようにやってるというよりは、CPU負荷軽減のために大雑把に処理してるだけ
YouTubeもそうか?間引いているようには聞こえないけど
なるほど、間引く間隔が大きいんだね
1~数サンプル単位で間引くイメージで考えてた
そんなに不連続ならクリックノイズ対策要りそう
データを1/2に間引いたのなら周波数はあがるだろう、早送りが高い音になるのと同じように
データを間引いても周波数が変わらないようにするには、どうすればいいかな?
>>163
数100msec単位で再生して間引いてクロスフェード 16bitモノラルのPCMを8bitにするには、
配列に入っている各データを右へ8bitシフトさせればいいんですよね?
言語はJavaです。
byte[] b = new byte[raw.length]; // rawはshort型の配列でPCMのデータが入っている
for(int i=0;i<raw.length;i++){
b[i] = (byte)(raw[i] >>> 8);
}
上手く再生されなくて問題の切り分けをしたいので
まずここだけ合ってるか教えてください。
>>>論理シフト
>>算術シフト
あってそうだけど
念のため
(byte)(0x0ff & (raw[i] >>> 8));
>>167
ありがとうございます。
念のために上位の8bitを0で埋めるんですね。
頑張ります。 >上手く再生されなくて問題の切り分けをしたいので
小出しはよくない
右へ8bitシフトって/256で良いんじゃないのか?
javaは知らないけど、奇麗な割算なら、コンパイラーが勝手(最適化適応時)にシフトに変換するんでは?
人間が分かりにくいように書く必要はない。
分かった、負の数をシフトしたことによって、頭が0で埋められて違う値になった。
16bitモノラルのPCMを8bitにする場合、
お前らならどんなコード書くんだ?
☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の
両院で、改憲議員が3分の2を超えております。
『憲法改正国民投票法』、でググってみてください。国会の発議は
すでに可能です。平和は勝ち取るものです。お願い致します。☆☆
確か8bitフォーマットはunsigned扱いだよ
だから (raw>>8)+128
音に限らずよくトラブルになるやつ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
6D9QH
すみません教えてください
マイコンなどのPWMで、ピーとかポーとかは鳴らせるのですが、
ピンとかポンのように弾む感じの音を作ることはできるのでしょうか?
マイコン以外に何か回路が必要ですか?
波形としては時間が経つにつれて振幅が減衰すると言えばいいでしょうか・・・
短時間のクロックを立ち上げてフィルタに入れればプッとかポッて音にできるよ
>>182
VCAとかVCF付ければ?・・・ってそれPWMというより矩形波として使ってるのか? >>183
ありがとうございます。CRで適当にフィルタを作ってみたところ
出ました。
>>184
矩形波しか出ないと思い込んでいました。
上記のフィルタで三角波のようなものも出せました。
今、PWMで音声出力に挑戦しています。 どうにかこうにかWAVをPWM1チャネルで再生することができました
昔の電話みたいで音質わるいですが・・・
>>186
今時のオーディオ用DACの中身を勉強してみるといいと思うよ wikipediaに、
>32bit-floatの場合には156[dB]、64bit-floatの場合には331[dB]もの広いダイナミックレンジを確保できる。
て書いてあるのだけど、floatと違ってdoubleが理論値に1dB足されているのは何故ですか?
それより32bit floatは1500dBの間違いじゃないか?
23bit(仮数部) + 1bit(ケチ表現) + 1bit(符号) + 1bit(浮動小数点の丸め)
からの26bit * 6dBで156dBですね
分解能144dB、Dレンジ1530dBじゃない?
まあどうでもいいけど
libsoxの馬鹿、Cygwin上では動くのに、Linuxだとコアダンプするし
ドキュメントはAPIの説明全然してないし、サンプルコードも役に立たん
結局sox_init()の後sox_format_init()を実行すると正常に動くようになった。
>>197
libsoxは品質は良いけどドキュメントがダメすぎるよね。
自身でソース見て動作を把握したうえで引数を与えないと、意図しない動作する関数がある。 人いるかわからんけど訊いてみる
シンセ用のオシレータ作ってるんだけどルックアップテーブル作らないで(要は1つの波形につき1つのテーブルのみ)
アンチエイリアシングしたいんだけど不可能?
再生速度を変えないって事?
なら再生するサンプルレートに合わせてあらかじめ変換しておけばいいんじゃない
シンセだから当然速度は変える 波形はユーザ定義が可能でリアルタイム処理を想定してる
あとsync処理とかも実装してる
一次補間してもしないのと同じぐらいエイリアスノイズが出るんです
テーブルサイズは1024固定、受け取る元データは2^n (n:2-10)の長さ
2^10未満の長さのデータについてはバイリニアで1024まで拡張
というか再生周波数に応じて帯域制限したテーブル複数用意する方法ならとっくに実装しているので、
>>200>>202の条件でエイリアスノイズを除去したいんです 出力サンプリング周波数より精度の高いカウンターを用意して、
波形メモリの参照先が半端になる場所は(1つのサンプルに対して切りが悪い状態の時)、
次の波形参照先を合成して出力電圧にする。 合成具合はカウンターの値からどっちが何%って計算できる。
多分、画像のアンチエイリアスとやってる事は同じ。
つまり何らかの補間を施せっていうことですか
補間云々でどうにか出来るのでしょうか
補完は元の領域でローパス掛けてるだけだから原理的にどうしてもエイリアシング残るよ
(ほぼ)完全に除去したいなら4倍以上でオーバーサンプリングしなきゃダメ
やっぱり逝きつく先はオーバーサンプリングか
なるべく低容量かつ高速なものを目指しているのですが両立は厳しいようですね
アドバイスありがとうございました もうしばらく考えてみます
200がまだいるか分からないけど
その1024サンプルをFFTしといて、
読み出しスピード決まった時に、帯域外になるエレメントを0にしてIFFTしたの(実部)から
直近2サンプルの直線補完で再生すればいいんじゃない?(適当)
繰り返し波形だから窓も要らない
それなりに知識があれば、読み出し用FIR型LPFを随時生成するとかの方が良いと思うけど
移動平均+軽いIIR型LPFとかでも良いと思うけど
どれくらい処理能力に余力があるのかとか、求める音による(シンセだし)と思うなあ
オシレータにFFT使えば最強じゃね!?
っていうのは誰でも思いついていざ実装して絶望するやつだw
>要は1つの波形につき1つのテーブルのみ
それすら不要ん
この流れ、てっきり波形テーブルベースだと勘違いしてたわ…
テーブル用意する的なこと書いてるし
FFTといえば大浦さんのFFTSG使ってたけど、最近出てきたOTFFT早い!
それってintelやappleのライブラリより早いの??
intelならintelのsimdコンパイラが楽やわ
レーン数見分けて動いてくれるし速いライブラリに近いスピードが出るから
ライブラリに頼らないで好きな形で組める
おや、こんなスレがあったんだな!
MIDIもここでいいのか?でもスレ検索しても2単語しか出てこなかったけどなwww
よく市販のMIDIアプリでIN/OUTを設定したら
ほかのアプリで同じデバイスを指定しようとするとロックされて開けないのがあるんだが
あれはどんなAPIで他からの接続をロックしてるんですかね?
MIDI APIのmidiOutOpen()ですでに他に開いてるのがいたら
MMSYSERR_ALLOCATEDが返ってくるんじゃないかね
>>228
ああそうか!そういうリザルトあったね!
でもダブってデバイス開いてもあまり問題は起きないんだけどね
むしろ一度デバイスつかんだら放してくれなくて
他のに繋ぎ変えたいとき再起動しないとどうしようもないってアプリもあるんだよね…orz
デバイス解放するのってmidiInReset()とかだっけ? あれ?確認しようと「midiInReset」でググったら
「midiOutReset」しかでてこないよ?
検索キーワードが強制的に変えられてる
なんで?
>>232
なるほど、そういう解放の仕方もあるのか
で
意図的に2重に開いて
MMSYSERRを見たら
MMSYSERR_ALLOCATED = 4じゃなくて
MMSYSERR_NOTENABLED = 3 : ドライバがロードまたは初期化に失敗しました。
が返ってきたわ
そしてよくよく考えたら
先行して開いてたアプリにロックされてたんじゃなくて
自分の作ったプログラムがエラーリザルト拾って自ら開かなかっただけなのかwww >>233
あー自己レス前言撤回
アプリの組み合わせによっては
デバイスの多重オープンできることもあるな
リザルトを拾う拾わないの違いではないみたい
時間が無いので何故そんな違いが出るのかは未確認
知ってる方、予想のつく方、いたら教えてください >>236
MIDIのことはよく知らないけど
MMEは古すぎて互換のために用意されてるだけなので
新しいネイティブなAPIがあるのでは?と思う >>238
確かにネイティブなMIDIはWin32APIでめちゃ古いけど
これ以外に新しいネイティブなAPIってあるのかな?
あったらそっち使いたいけど
あってもSMFを再生するだけみたいなパッケージされたものじゃね? てゆーかMIDIって
デバイスの認識とオープン/クローズができて
そこから必要なデータを取り出したら
あとはバイトデータの四則計算だからな
今デバイスはほとんどUSBだし
新しいハードウエアや転送方式でも出てこない限り
新しいAPIは必要無いかもね
最近MIDI規格が新しくなったと聞くけど
新しいAPIの話にはならないんだね?
ああ、ロングメッセージをもっと簡単に扱えるAPI作ってほしいかも
BT MIDIとか追加されてるんじゃなかったっけ?
既存のソフトのスペクトラムアナライザーに不満がある
→自作出来ないか→FFTとかWFTとかが理解できない→orz(イマココ)
というかパソコンがリアルタイムでFFT出来る能力を獲得して20年以上
その間にパソコンの計算能力は一桁以上向上しているがスペクトラムアナライザーの
周波数、時間、ダイナミックレンジ等の分解能が向上しているように見えない。なじぇ
てゆーかさ論文1つ解説しろって
新しい論文1つ書けって言ってるに等しいじゃんwww
まずお前がその論文を要約して分からないところだけ質問しろよ
そうじゃないとリンク踏む気も起きない
>>248
要約:IIRヒルベルト変換フィルタの構成法
1)IIRハーフバンド楕円LPFを用意
2)これを全域通過移相フィルタ(のカスケード接続)を2つ足した形に変換する
但し元の伝達関数をH(z)として、H(z)=A(z^2) + B(z^2)/zを満足する事
(A, Bが全域通過移相フィルタ(のカスケード接続))
3)z→-jzとする事で、ヒルベルト変換フィルタ対になる。
4)通過域と阻止域の端を考慮しつつ周波数変換
2)の操作については、参考文献が示されてるのみなので、本当に出来るのかなぁ…と。 結局全部理解できないってことか?
正直に宿題の問題文を書け
250は古本で安く出回ってるので、購入します。
近所の図書館には置いてない…。
>>251-252
2)の過程を解説した日本語の参考文献やwebサイトが見つからないので、
漏れがじたばたしてるだけです。
(学校の宿題や輪講とかではないです) オールパスフィルタで90度位相差が出る周波数を作ってるだけじゃないの?
ここってAESの論文がサイトライセンスとかで読めるような人も見てるの?
そうでない限り有料の論文なんて限られた人しか購入しないでしょ…。
C#でMIDIのロングメッセージの受信→送信したいのだけど
コールバックの書き方が分かりません
ショートメッセージはmidiInOpen()のdwinstanceにコールバックのポインタ渡して
CALLBACK FUNCTIONで出来たのですが
ロングメッセージはこれと共通で出来ないでしょうか?
単にロングメッセージをINからOUTにスルーさせたいだけなのですが
それでもバッファの準備したり構造体指定したりしないとダメなんですかね?
何処かに参考になるコード公開されてませんかね?
>>249
このスレで専門的なこと説明したってわかるわけ無いだろ空気読めよ
もっとライブラリーの使い方とか聞けよ ありがとう
下のコードに何か使えるネタがあるかもしれない
勉強してきます
趣味のインチキMIDIプログラマで恐縮っすwww
ロングメッセージの受信に必要なAPIを自分でマーシャリングしたのですが
どなたか添削してください
いつも利用してるPINVOKEに登録されてなかったので
既に完成してるショートメッセージのプログラムに追加したいので
それと共通の型、書式にしたのですが
マーシャリングの型って結構自由なんですか?
いくつか調べたのですが少しずつ違ってたりするので良く分からない・・・
第1引数がintやIntPtrだったり
第2引数がrefやoutだったり・・・
どちらも引数は共通だと思います
[DllImport("winmm.dll")]
static extern uint midiInPrepareHeader(IntPtr hMidiIn, out MidiHdr lpMidiInHdr, uint uSize);
[DllImport("winmm.dll")]
static extern uint midiInAddBuffer(IntPtr hMidiIn, out MidiHdr lpMidiInHdr, uint uSize);
うーーーーん自己レス
マーシャリングは良く分からんが仮にプログラム組んで
バッファ生成、登録してみたらリザルトは0が返ってくるから合ってるだろうなあ?
これでINデバイスにエクスクルーシブ入れたら自動で受信が始まるのかと思ったけど
始まらん・・・なんで?
テキトーだけど最初に疑うのは
floatとdoubleの差とか
unsigned付け忘れとか
あとmath.hのincludeし忘れとか
どうも
数式や方式が違うから結果が微妙に異なるのは当然なんです
ただ、どっちの方がいいのかなーと
ぱっと見(1)は簡易版的な感じがするかなあ(tanが出てこないあたり)
簡単な確認方法は、カットオフ周波数を高く設定して(fs=44.1kHzならfc=10kHzとかに設定)
そのカットオフ周波数の信号入れてちゃんと-3dBになる方が正解
>>269
双一次変換のpre-warpingの読み方って
・プリワーピング
・プリウオーピング
・そのほか 流行らない理由はpdfに書いてあるしプリワーピング
>>274
2次IIRの縦続構成は、
高次IIRで分子/分母の組合せで悩まないといけないけど、
そういうのは設計用ソフトが組合せを推奨してくれるものなのかなぁ? 2次くらいなら係数を見比べれば悩む程のこともないでしょ
際どいことをするならそれぞれの通る帯域と極の順番を考慮するくらい?
答えが何通りも(無限に)あったら無理やろ。
素因数分解みたいに特定出来る訳じゃなく、
π求める公式だって無限にあるやん?
>>278
多分答えは一通りしかない筈なんだけど、
例えば、高次多項式で表されてるIIRを並列接続に変換する際に、
IEEE754の倍精度での計算では十分な精度が得られない…と云うイメージです。
そこだけ任意精度計算出来ればいいのですが。 >>280
多分真面目にやろうとすると精度保証付き数値計算(≒区間演算)になるんだけど、
Mathematicaの一択になると思う。
仕事で使うには値段が高いので稟議が通り難い…。
RasPiのMathematicaやWolfram Programming Labを
内緒で仕事に使うのは駄目なんだろうなぁw >>282
BYODやBYOAで済むなら楽なんですけどねぇ >>285
縮小したらピッチが高くなってしまいました。質問を取り下げます。 双一次変換のpre-warpingの逆って、
・post-warping
・un-pre-warping
・de-pre-warping
・そのほか