簡単な方法でウェーブ ファイルの周波数を分析する方法は? 余分なモジュールなし。
4 に答える
「分析する」とはどういう意味ですか?それは多くの異なることを意味する可能性がありますが、私が知っている最も簡単な方法の1つは、離散関数に簡単に実装できる畳み込みを使用することです(配列内のポイントを持つか、離散ステップを試します):
これは次の方法で簡単に実行できます。
for i in main_array:
from = i - len(convolution_kernel)/2
// Todo: check boundaries
result[i] = 0
for j in convolution_kernel:
result[i] += convolution_kernel[j] * main_array( from+j)
または、循環畳み込みを使用することもできます (eryksuns のコメントから得たアイデア):
result = [sum(f[m]*g[n-m] for m in xrange(len(f))) for n in xrange(len(g))]
これにより、特定の信号が別の信号に存在するかどうかをテストできます (周波数 10、20、50 などを試して、最良の結果を得ることができます)。
また、フーリエ変換について少し調べたり、調べたりするdetermine wave frequency
こともできます (これは、多くの信号処理アルゴリズムの基礎となっています)。
ウェーブファイルが1つのノートのみで構成されている場合は、ウェーブの周期性を検出するだけで、基本周波数(倍音ではない)を取得できます。これを行うには、0交差点を探します。
免責事項:信号処理は私の専門ではないため、この回答は少し粗雑で初歩的かもしれません。お気軽に訂正してください/私:)
フーリエ解析を調べます。フーリエ変換は、入力を時間領域から周波数領域に変換します。もう少し説明しましょう。
たとえば、サウンドをサンプリングする場合、サンプリング周波数とビット深度を決定します。CD は 44.1 kHz でサンプリングされており、解像度は 16 ビットあたりだと思います。サンプル。つまり、音楽は 1 秒間に 44,100 回サンプリングされ、16 ビット値に変換されます。音楽は、長さが 44,100 のベクトル (または配列) として表されます。これは時間の関数であるため、これは時間領域です。
一方、データをフーリエ変換すると、代わりにデータが周波数の関数として表されます。ベクトルの長さは 44,100 要素のままですが、各要素は振幅 (各周波数でどれだけの「信号」をサンプリングしたか) を表します。言い換えれば、サンプリング期間全体にわたって、信号に含まれる各周波数の信号の合計量です。
離散フーリエ解析と高速フーリエ変換 (FFT) の実装を調べる必要があります。
この質問はFFT分析にもう少し触れています: Scipy/Numpy FFT Frequency Analysis
編集:
私は恥知らずにもいくつかのグラフィックをオンラインで盗みました:
FFT 式:
時間対周波数ドメイン:
FFT アルゴリズム全体を実装したくなく、追加のモジュールも必要ない場合は、特定の周波数の効果的なフーリエ変換であり、サンプルのその周波数での電力を提供するGoertzel アルゴリズムをお勧めします。
define goertzel(sample, target_frequency, sample_rate):
s_prev = 0
s_prev2 = 0
normalized_frequency = target_frequency / sample_rate
coeff = 2 * cos(2 * PI * normalized_frequency)
for element in sample:
s = element + coeff * s_prev - s_prev2
s_prev2 = s_prev
s_prev = s
end
power = s_prev2 * s_prev2 + s_prev * s_prev - coeff * s_prev * s_prev2
return power