問題タブ [pitch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 自己相関を使用したピッチ検出
信号のピッチを検出するために自動相関機能を使用しています。式 acf(s)=(1/n)*sigma(|x(n)-x(n+s)|) を使用しています
ここからどのように進めますか。最小値を見つける必要があり、ピッチは最小値のインデックスです。この場合、ピッチは常に 0 です。正しく行っていますか? 私は助けが必要です。ありがとう。
ios - iOS:OpenALからバッファーへのピッチシフトとパイピング出力
私は最近、iOSでOpenALを使用してピッチシフトを行うことが可能であることを発見しました。
ホランスのサウンドバンクプレーヤーを見ています。範囲全体に散らばった15程度のピアノの音を取り込み、どのサンプルに最も近いかを判断し、そのサンプルを適切な量だけピッチシフトすることで、任意の音を演奏します。これはそれを行うコードです:
この線がピッチシフトを行っていることがわかります。
残念ながら、これはCPUを大量に消費するため、ノートのバンドルを同時に再生するのには適していません。ダイナミックにピッチシフトしています。
私が欲しいのは、ピアノの音ごとにバッファーを作成し、このピッチシフトテクノロジーを使用してこれらのバッファーにデータを入力することです。しかし、スピーカーから再生するのではなく、openALを使用してサウンドをバッファーに再生する方法がわかりません。
alSourcePlay(source-> sourceId);の出力をパイプする方法はありますか。
バッファに?
これができない場合、どのような選択肢がありますか?DSPDimensionの記事のsmbPitchShiftを使用してみましたが、忠実度が高くありません。ピアノの音のアタックフェーズが実際に失われています。私はDirac3の無料バージョンを使用できると思います...(現時点ではフルバージョンのお金はありませんが、無料バージョンではモノラル処理が可能だと思うので、それをハックできます)。他に選択肢はありますか?
編集:私はそれ以来Dirac3をテストしました、そしてそれは同じ問題を共有します。攻撃を包み込んでいるようです。OpenALのピッチシフターはどういうわけかDirac3がしないことをしているようです。
signal-processing - ピッチ検出のためのケプストラル分析
音声信号からピッチを抽出しようとしています。
IRC の誰かが、ダブル FFT を使用してこれを実現する方法を説明してくれました。具体的には:
- FFTを取る
- 絶対値の 2 乗の対数を取る (ルックアップ テーブルで実行可能)
- 別のFFTを取る
- 絶対値をとる
vDSPを使用してこれを試みています
なぜこのテクニックを以前に知らなかったのか理解できません。私はたくさんの狩りと質問をしました。数週間分。もっと言えば、なぜそれを考えなかったのか理解できません。
vDSP ライブラリでこれを達成しようとしています。これらすべてのタスクを処理する機能を備えているようです。
ただし、最終結果の精度については疑問に思っています。
以前、単一の FFT の周波数ビンを調べて極大値を求める手法を使用しました。ピークが検出されると、狡猾な手法 (最後の FFT からの位相の変化) を使用して、ビン内の実際のピークをより正確に配置します。
ここで紹介するこの手法では、この精度が失われるのではないかと心配しています。
2 番目の FFT の後にこの手法を使用して、基本波を正確に取得できると思います。しかし、ステップ 2 で情報が失われているように見えます。
これは潜在的にトリッキーなプロセスであるため、経験のある誰かが私が行っていることを見て、正気かどうかをチェックしてもらえますか?
また、隣接するビンに二次関数を当てはめることを含む代替手法があると聞きました。これは同等の精度ですか?もしそうなら、ビンフェーズを覚える必要がないので、私はそれを支持します。
だから、質問:
- このアプローチは理にかなっていますか?改善できますか?
- 「対数二乗」コンポーネントが少し心配です。まさにそれを行う vDSP 関数があるようです: vDSP_vdbcon. ただし、対数テーブルを事前計算するという兆候はありません-FFT関数では、明示的な事前計算関数を呼び出して渡す必要があるため、そうではないと思います。そして、この機能はそうではありません。
- 高調波を拾う危険性はありますか?
- vDSP に最大値を最初に引き出させる狡猾な方法はありますか?
この手法に関する研究や文献を教えてくれる人はいますか?
主な質問: それは十分に正確ですか? 精度を上げることはできますか?専門家から、正確さは確かに十分ではないと言われました. これは行の終わりですか?
円周率
PS タグを作成したいときにとてもイライラしますが、できません。:| 私はメンテナーにタグの試行を追跡するよう提案しましたが、無視されたことは確かです。vDSP、加速フレームワーク、ケプストラム分析用のタグが必要です
java - ピッチ検出とJavaの変更
私はフランス語ですので、私の文章のいくつかを理解するのに苦労してすみません。とにかく、いくつかのトピックで、フーリエ変換のおかげでピッチが影響を受ける可能性があることを知りましたが、それを実装する方法を本当に理解していませんでした。さらに、wavファイルのピッチを変更する方法が見つかりませんでした。可能であればmp3ファイルをwavにjavaSound、mp3にJLayerを使用して音楽を聴いています。ありがとう
java - 音の高さ(周波数)をグラフ化する
音の高さをグラフにプロットしたい。
現在、振幅をプロットできます。以下のグラフは、 によって返されたデータによって作成されますgetUnscaledAmplitude()
。
しかし、振幅ではなく、オーディオのピッチを表示する必要があります。高速フーリエ変換はピッチを取得するように見えますが、私が持っている生のバイトよりも多くの変数を知る必要があり、非常に複雑で数学的です。
これを行う方法はありますか?
android - ランドスケープ モードでのピッチの問題
縦向きモードと横向きモードの両方で、ピッチ値 (電話が前後にどれだけ傾いているか) を読み取る必要があります。ポートレートで次のコードを使用すると、値 [1] から値を取得できます。電話を上向きにして平らに置いた場合は 0.0、直立した場合は -90、デバイスの面に平らに置いた場合は 180 です。今まではすべて素晴らしい...問題は、デバイスが横向きモードのときに発生します。この時点で、値 [2] を使用してデバイスの傾きを測定していますが、問題は値にあります。電話機が平らに横たわっている場合 (OK) は 0 で、直立している場合 (OK) は 90 に上昇しますが、続行すると値が再び 90 (80、75 など) を下回ったため、値が同一であるため、基本的にこれら 2 つの位置を区別できません。だから、私が間違っていることは、
ここと同じ質問: http://groups.google.com/group/android-beginners/browse_thread/thread/c691bbac3e294c7c?pli=1
私は次のコードを持っています:
}
algorithm - ポテンシャル高調波から基本周波数を決定するアルゴリズム
音源から基本周波数を抽出しようとしています。誰かがマイクに向かって A3 を歌っているかもしれないので、〜 110Hz を検出したい
私のアプローチは次のとおりです。
- FFT 1024 フロート
- 各ビンの位相を使用して、その正確な周波数を正確に決定します
- ピークを決定する (通常は 50 程度)
- 大きい順に並べる
(ピーク[0].パワー=1063.343750、.freq=2032.715088
(ピーク[1].パワー=1047.764893、.freq=3070.605225
(ピーク[2].パワー=1014.986877、.freq=5925.878418
(ピーク[3].パワー= 1011.707825、.freq=6963.769043
(ピーク[4].パワー=1009.152954、.freq=4022.363037
(ピーク[5].パワー=995.199585、.freq=4974.120605
(
ピーク[6].パワー=987.2437.
[7].power=533.514832, .freq=908.691833
- (MARKER1) 最も大きなものから始めて、それを残りのすべてのピークと照合します。したがって、N 個のピークがある場合、この時点で N-1 個のピーク ペアを持つことになります。
- 各ピークペアの高調波を調べます。つまり、分数 a/b にどれだけ近いか、つまり |peakA.freq/peakB.freq - a/b| となるような b<20 の a/b を見つけることができるか。< 0.01 (これは 20 番目までの高調波に一致します)
これで、互いに調和していると見なされるピークの洗練されたリストができました
高調波 PeakPair: (0,1)=2/3、エラー:0.00468 => f0 @ 1019.946289
高調波 PeakPair: (0,2)=1/3、エラー:0.00969 => f0 @ 2004.003906
高調波 PeakPair: (0,3) =2/7、エラー:0.00618 => f0 @ 1005.590820
高調波ピークペア: (0,4)=1/2、エラー:0.00535 => f0 @ 2021.948242
高調波ピークペア: (0,5)=2/5、エラー:0.00866 => f0 @ 1005.590820
高調波ピークペア: (0,6)=1/4、エラー:0.00133 => f0 @ 2027.331543
高調波ピークペア: (0,7)=9/4、エラー:0.01303 => f0 @ 226.515106
私の質問は、上記の基本波を ~1000Hz として正しく識別するアルゴリズムをどのように考案できるでしょうか?
~2000 や ~3000 よりも ~1000 に高い値が集中することは決して保証されません。 ~1000 のエントリがあることさえ保証されません。~5000 x 1 エントリ、~4000 x 3 エントリ、~3000 x 2 エントリ、および上記のリストの 226 のようにいくつかの偽の値が浮かぶ可能性があります。
リストの残りの部分と「調和」していない提案されたファンダメンタルズを除外して、手順をもう一度繰り返すことができると思います。これにより、少なくとも偽の値が取り除かれます...
正しい質問をしていないのかもしれません。たぶん、このアプローチ全体が最悪です。しかし、最も強いピークを選び、そのピークに関連する一連の高調波を抽出することは理にかなっていると思います。
理論的には、比率の負荷を生成する必要があります。たとえば、元の最強のピークが 3 番目の高調波であった場合、この一連のピークには 3/1 3/2 3/3 3/4 3/5 3/6 3/7 などを含める必要があります。 ...一部欠落している場合がありますが。
現実的には、最大の強さを持つのは常に基本波か第 1 高調波になると感じています。しかし、これに頼ってよいかどうかはわかりません...
非常に多くの要因があり、頭が泳いでいます。このような厄介な質問を事前にお詫び申し上げます。死後に整理できるといいですね。
c# - C# の FFT の不正確さ
FFT アルゴリズムを試してみました。インターネットからのFFTアルゴリズムの作業コードとともにNAudioを使用します。私の観察によると、結果のピッチは不正確です。
何が起こるかというと、E2 (ギターの最低音) から約 E6 までのピッチ進行を含む WAV ファイル (44.1khz、16 ビット、モノラル) に変換された MIDI (GuitarPro から生成) があります。低いノート (E2-B3 あたり) の結果は、一般的に非常に間違っています。しかし、C4 に到達することは、適切な進行 (次の音は C#4、次に D4 など) が既に確認できるという点である程度正しいです。ただし、検出されたピッチが実際のピッチよりも半音低いという問題があります (たとえば、音符は C4 のはずですが、D#4 が表示されます)。
何が間違っていると思いますか?必要に応じてコードを投稿できます。どうもありがとう!私はまだ DSP の分野を把握し始めています。
編集:これは私がやっていることの大まかなスクラッチです
次に: (関数は float[] のみを受け入れるため、waveBuffer は単純に byte[] を float[] に変換するために存在するクラスです)
そして最後に: (Smbpitchfft は FFT アルゴを持つクラスです...何も問題はないと信じているので、ここには投稿しません)
そして結果を解釈するために:
更新(まだ興味がある場合):
したがって、以下の回答の 1 つは、FFT からの周波数ピークが常にピッチと等しいとは限らないと述べています。という事は承知しています。でもそれなら自分でやってみたかった(周波数のピークが結果のピッチになる場合もあるという前提で)。したがって、基本的に、オーディオ信号の周波数領域を表示できる 2 つのソフトウェア (DewResearch による SpectraPLUS および FFTProperties ; それらのクレジット) を入手しました。
時間領域での周波数ピークの結果は次のとおりです。
スペクトラプラス
および FFT プロパティ:
これは、A2 (110Hz 前後) のテスト ノートを使用して行われました。画像を見ると、SpectraPLUS では 102 ~ 112 Hz、FFT プロパティでは 108 Hz の範囲に周波数のピークがあります。私のコードでは、104Hz を取得します (8192 ブロックと 44.1khz のサンプルレートを使用します ... 8192 を 2 倍にして複雑な入力にするため、最終的には、SpectraPLUS の 10Hz ビンサイズと比較して、ビンサイズが約 5Hz になります。 )。
ソフトウェアでは正しい結果が返されるように見えますが、私のコードでは常に104Hzになるため、今は少し混乱しています(使用したFFT関数をMath.Netなどの他の関数と比較したことに注意してください。正しい)。
問題は私のデータの解釈にあると思いますか? または、ソフトウェアは周波数スペクトルを表示する前に何か他のことをしますか? ありがとう!
fft - FFTとピッチ推定に関するいくつかの質問
一般的に、FFTとピッチ推定で必要な説明がいくつかあります。
1.)FFTのブロックサイズが大きいほど、精度が高くなることを読みましたが、これには欠点もあることはわかっています。これは本当に本当ですか?私は実験を続けており、8192や4096ではなく16384のブロックサイズを使用すると、結果が悪くなります。誰かがこれについて私を明確にすることができますか?
2.)当初、FFTからピッチを取得することは、最高強度のビンを取得するという単純な問題であると私は信じていました。しかし、ここにいくつかの質問を投稿して読んだ後、これはもっとあるかもしれないと思います。誰かがFFTから適切なピッチ推定を取得する方法について私に提案できますか?
3.)私はすでに良い考えを持っていますが、誰かが自動相関アルゴリズムが何をするのかを簡単な言葉で説明できますか?(私の考えでは、基本的には比較対照アルゴリズムであり、差異が最も小さいものが選択されます)
どうもありがとう!
ios - iOS でのオーディオの録音、変更、および再生
編集:最後に、以下で説明したとおり、音声の録音には AVRecorder を使用し、ピッチ シフトと再生には openAL を使用しました。それはかなりうまくいきました。
オーディオの録音、変更、再生について質問があります。以前にも同様の質問をしました ( iOS でのリアルタイムでの録音、ピッチの変更、およびオーディオの再生) が、より多くの情報が得られたので、さらにアドバイスをお願いします。
まず、これが私がやろうとしていることです(メインスレッドとは別のスレッドで):
- iPhoneのマイクを監視する
- 特定の音量以上の音を確認する
- しきい値を超えた場合、記録を開始します。例: 人が話し始める
- 音量がしきい値を下回るまで録音を続ける (例: 人が話すのをやめる)
- 録音された音のピッチを変更します。
- 再生音
AVRecorder を使用してサウンドを監視および録音することを考えていました。こちらの優れたチュートリアル: http://mobileorchard.com/tutorial-detecting-when-a-user-blows-into-the-mic/
そして、openAL を使用して、録音されたオーディオのピッチを変更することを考えていました。
だから私の質問は、上記のポイントのリストで私の考えは正しいですか、何かが欠けているのでしょうか、それとももっと良い/簡単な方法がありますか. オーディオ ライブラリを混在させずに、AVFoundation を使用してピッチを変更することはできますか?