array[5000][440] のようなもので配列にアクセスしたいと思います。これは、開始から 5000ms と 440hz を意味し、まさにこの位置での周波数の振幅の値を与えてくれます。
ここにそのようなものが見つかりませんでした。もしあれば、それを教えてください。
基本的にはスペクトログラムが必要です。まず始めに、サウンド ファイルを小さなチャンクに分けて調べます。各チャンクは、たとえば 1/10 秒であり、これらのチャンクのそれぞれを FFT します。(もちろん、5000ms と 440Hz を調べるには、適切なチャンクの FFT に移動します。)
あなたはいくつかの誤解の下で活動しています。
特定の時点での波の周波数を取得することはできません。関心のあるポイントの前後の多くのポイントを含む時間枠を選択する必要があります。含めるポイントが多いほど、周波数の内訳でより多くの解像度が得られます。これらのポイントで何らかのウィンドウ関数を実行してから、FFTを実行する必要があります。
FFTの結果が得られたら、数値は周波数に対応しますが、単純な関係にはなりません。各出力に対応する周波数を制御することはできません。これは、信号のサンプリング周波数とサンプル数の組み合わせによってすでに決定されています。変換式が手元にないのではないかと思います。各周波数には、実数と虚数の2つの成分があり、振幅はになりますsqrt(r**2+i**2)
。
時間と周波数をその場で変換できます。__getitem__
さらに使用するために、おそらくlru_cache
いくつかの値を保存する必要が あります。
フーリエはこのようなものだとしましょう
class Fourier():
def __init__(self,a=10):
self.a=a
def __getitem__(self, index):
#this is function that calculates and returns value of my_furier
return self.a+index
t=Fourier()
print(t[12.4])
フーリエから時間にアクセスするために同じことを適用できます。そのため、有効な時間を選択してその時間を返すことを可能にする新しい時間オブジェクトを作成するか、何らかの補間を使用して表にない値を返すことができます。
すべての値を ram に保存できない場合はshelve
、標準ライブラリのモジュールを使用して、ディスクからアイテムを保存およびアクセスできます。必要に応じて、インターフェイスに補間を適用できます。