1

私は現在、44100HzのオーディオサンプルでPythonのNumpy fftを実行しています。これにより、0Hz〜22050Hzの動作周波数範囲が得られます(Nyquistに感謝します)。これらの時間領域の値で fft を使用すると、fft スペクトルに 128 ポイントがあり、周波数ビン サイズごとに 172Hz が得られます。

サンプルの作成方法を調整して fft カウントを 256 に増やすのではなく、周波数ビンを 86Hz に引き締めても 128 fft ポイントのみを維持したいと考えています。

私が持っている質問は、これが理論的に可能かどうかです。私の考えでは、0Hz から 11025Hz までの任意の Hz 値でのみ fft を実行することです。それ以上はとにかく気にしない。これにより、作業スペクトルが半分になり、周波数ビンが 86 Hz になり、128 スペクトル ビンは維持されます。おそらく、これは時間領域のウィンドウ関数を介して達成できますか?

現在、サンプルを作成してから fft に変換するために使用しているコードは次のとおりです。

import numpy as np

sample_rate = 44100
chunk = 128
record_seconds = 2

stream = self.audio.open(format=pyaudio.paInt16, channels=1,
                        rate=sample_rate, input=True, frames_per_buffer=6300)

sample_list = []

for i in range(0, int(sample_rate / chunk * record_seconds)):
    data = stream.read(chunk)
    sample_list.append(np.fromstring(data, dtype=np.int16))

### then later ###:

for samp in sample_list:
        samp_fft = np.fft.fft(samp) ...

これを十分に明確に表現したことを願っています。説明や用語を調整する必要がある場合はお知らせください。

4

3 に答える 3

1

FFT のサイズを 2 倍にすることは当然のことですが、これを実行できない正当な理由がある場合は、FFT の前に 2 倍のダウンサンプリングを行って、有効なサンプル レートを 22050 Hz に下げることを検討してください。

- Apply low pass filter with cut off at 11 kHz
- Discard every other sample from filtered output
- Apply FFT to down-sampled data
于 2015-05-06T06:09:36.183 に答える
0

隣接する周波数ピークまたはノイズ間を解決しようとしていない場合は、周波数ビン間隔の半分まで、データをゼロ パディングして FFT 長を 2 倍にすることができます。追加のデータを待つ必要はありません。次に、周波数範囲 0..Fs/2 の下半分だけが必要な場合は、FFT 結果ベクトルの中間半分を破棄します (これは通常、周波数範囲の下半分を計算するよりもはるかに効率的です)。非 FFT 手段)。

ゼロ パディングは、高品質の補間と同じ結果をもたらすことに注意してください (元の FFT 結果ポイントのプロットを平滑化する場合と同様)。ピーク分離の分解能は向上しませんが、ノイズ レベルが十分に低い場合は、プロット内のより正確なピーク位置を簡単に選択できる可能性があります。

于 2015-05-06T18:02:16.857 に答える