6

私はFFTを使用していて、現在FFTを使用してファイルからサウンド波形を取得しようとしていますが(最終的には変更します)、変更した波形をファイルに出力します。音波のFFTを取得し、その上で逆FFT関数を使用しましたが、出力ファイルがまったく正しく聞こえません。波形のフィルタリングは行っていません。周波数データを取得してファイルに戻すことをテストしているだけです。同じように聞こえるはずですが、大きく異なります。

それ以来、私はこのプロジェクトに少し取り組んできましたが、まだ望ましい結果が得られていません。出力されたサウンドファイルはノイズが多く(元のファイルには存在しなかった余分なノイズと、より大きなノイズの両方)、一方のチャネルからのサウンドがもう一方のチャネルにリークしました(以前は無音でした)。入力サウンドファイルはステレオの2チャンネルファイルで、1つのチャンネルからのみサウンドが聞こえます。これが私のコードです:

import scipy
import wave
import struct
import numpy
import pylab

from scipy.io import wavfile

rate, data = wavfile.read('./TriLeftChannel.wav')

filtereddata = numpy.fft.rfft(data, axis=0)
print(data)

filteredwrite = numpy.fft.irfft(filtereddata, axis=0)
print(filteredwrite)

wavfile.write('TestFiltered.wav', rate, filteredwrite)

なぜこれが機能しないのかよくわかりません。

ここで問題を解決するのに役立つ場合は、問題の.pyファイルとオーディオファイルを圧縮しました。

4

4 に答える 4

6
  1. ここではフィルターを適用していないようです
  2. ifft入力波形ではなく、fft(ポストフィルタリング) を使用することをお勧めします。
于 2012-04-19T06:39:45.540 に答える
4

こんな感じじゃないですか?

filtereddata = numpy.fft.fft(data)
# do fft stuff to filtereddata
filteredwrite = numpy.fft.ifft(filtereddata)
wavfile.write('TestFiltered.wav', rate, filteredwrite)
于 2012-04-19T06:49:55.490 に答える
4
>>> import numpy as np
>>> a = np.vstack([np.ones(11), np.arange(11)])

# We have two channels along axis 0, the signals are along axis 1
>>> a
array([[  1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.],
       [  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.]])
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1)
array([[  1.1       ,   1.1       ,   1.1       ,   1.1       ,
          1.1       ,   1.1       ,   1.1       ,   1.1       ,
          1.1       ,   1.1       ],
       [  0.55      ,   1.01836542,   2.51904294,   3.57565618,
          4.86463721,   6.05      ,   7.23536279,   8.52434382,
          9.58095706,  11.08163458]])
# irfft returns an even number along axis=1, even though a was (2, 11)

# When a is even along axis 1, we get a back after the irfft.
>>> a = np.vstack([np.ones(10), np.arange(10)])
>>> np.fft.irfft(np.fft.rfft(a, axis=1), axis=1)
array([[  1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00,   1.00000000e+00,   1.00000000e+00,
          1.00000000e+00],
       [  7.10542736e-16,   1.00000000e+00,   2.00000000e+00,
          3.00000000e+00,   4.00000000e+00,   5.00000000e+00,
          6.00000000e+00,   7.00000000e+00,   8.00000000e+00,
          9.00000000e+00]])

# It seems like you signals are along axis 0, here is an example where the signals are on axis 0
>>> a = np.vstack([np.ones(10), np.arange(10)]).T
>>> a
array([[ 1.,  0.],
       [ 1.,  1.],
       [ 1.,  2.],
       [ 1.,  3.],
       [ 1.,  4.],
       [ 1.,  5.],
       [ 1.,  6.],
       [ 1.,  7.],
       [ 1.,  8.],
       [ 1.,  9.]])
>>> np.fft.irfft(np.fft.rfft(a, axis=0), axis=0)
array([[  1.00000000e+00,   7.10542736e-16],
       [  1.00000000e+00,   1.00000000e+00],
       [  1.00000000e+00,   2.00000000e+00],
       [  1.00000000e+00,   3.00000000e+00],
       [  1.00000000e+00,   4.00000000e+00],
       [  1.00000000e+00,   5.00000000e+00],
       [  1.00000000e+00,   6.00000000e+00],
       [  1.00000000e+00,   7.00000000e+00],
       [  1.00000000e+00,   8.00000000e+00],
       [  1.00000000e+00,   9.00000000e+00]])
于 2012-04-25T01:37:35.320 に答える
2

2つの問題。

2チャンネルデータをFFTしています。通常の意味でFFTの結果を得るには、モノラルデータのFFT1チャネルのみを使用する必要があります。2チャンネルのステレオデータを処理する場合は、各チャンネルを個別にIFFT(FFT())する必要があります。

実際のfftを使用しているため、情報が破棄されるため、fftは反転できなくなります。

反転する場合は、複雑な結果を生成するFFTを使用してから、この複雑な周波数領域ベクトルを時間領域に戻します。周波数領域ベクトルを変更する場合、厳密に実際の結果(数値ノイズを差し引いたもの)が必要な場合は、共役対称のままであることを確認してください。

于 2012-04-19T22:50:59.007 に答える