2

scipy.fftpackおよびscipy.ioパッケージを使用してPythonでいくつかのオーディオファイルを操作しています。これが意味するのは、インポートしているウェーブファイルがあり、フーリエ変換を使用してそれらをいじってから、新しいウェーブファイルに出力しているということです。ただし、これらの変換を実行した後、waveファイルが再生されず、元のファイルの約4倍のサイズになるという問題が発生しています。

現在、曲をインポートし、インポートからレートとデータピースを取得し、ifft(fft(data))を実行して、これを出力しています。これらのfloat値を取得して整数に変換し、最初にインポートされたデータとifft(fft(data))の差を計算してみたところ、正確にゼロであることがわかりました。

だから私が持っている質問は次のとおりです:

  1. フーリエ変換を行った後に再生しようとしているウェーブファイルが再生されない理由を誰かが知っていますか?

  2. 一般的に問題を引き起こしていると思われるwaveファイルに制限はありますか?または、データは整数である必要がありますか?

遅く、私の投稿はまばらになっているように感じます。詳細が必要な場合は、お問い合わせください。より適切な説明を提供できるよう最善を尽くします。

4

1 に答える 1

4

処理後、データを適切なビット深度の整数型に変換する必要があります。このファイルを例として使用します。

>>> import scipy.io.wavfile
>>> rate, data = scipy.io.wavfile.read('Happy Tree Friends.wav')
>>> rate
8000
>>> data
array([ 5, -5,  5, ...,  0, -1,  0], dtype=int16)
>>> data_bis = np.fft.ifft(np.fft.fft(data))
>>> data_bis
array([  5.00000000e+00 -1.55406753e-11j,
        -5.00000000e+00 +1.95349676e-11j,
         5.00000000e+00 +1.41131140e-11j, ...,
         8.06674092e-12 -7.58643463e-13j,
        -1.00000000e+00 -2.21611283e-12j,  -2.04999489e-11 +4.55890751e-12j])
>>> data_bis.dtype
dtype('complex128')

の値はの値にdata非常に近いですdata_bisが、次のように、それらは非常に異なる獣です。

>>> scipy.io.wavfile.write('test.wav', rate, data_bis)
>>> scipy.io.wavfile.read('test.wav')
TypeError: data type not understood

しかし、処理した結果を元に戻すだけdtypeで、すべてが再びうまく機能します。

>>> scipy.io.wavfile.write('test.wav', rate, data_bis.astype(data.dtype))
__main__:1: ComplexWarning: Casting complex values to real discards the imaginary part
>>> scipy.io.wavfile.read('test.wav')
(8000, array([ 4, -5,  4, ...,  0, -1,  0], dtype=int16))
于 2013-03-24T08:11:35.167 に答える