По непонятной причине результат получившийся после фурье преобразований звучит медленно, при этом исходный звук сильно зашумлен. Нормальный звук получается только если убрать все нечетные или четные значения из результата.
def fft_compress():
N = 1000000
frames = wave.open('input.wav','r').readframes(N)
vals = array.array('i')
vals.fromstring(''.join(frames))
fft_vals = fft.real_fft(vals[1::2], n = N) # selecting one channel
res = fft.inverse_real_fft(fft_vals)
print len(vals[1::2]), len(res)
wav_out = wave.open('fft_compress.wav', 'w')
wav_out.setnchannels(1)
wav_out.setsampwidth(4)
wav_out.setframerate(wave.open('input.wav','r').getframerate())
print "Into fft_compress.wav ", len(res[1::2]), " frames written."
wav_out.writeframes(res[1::2].tostring())
wav_out = wave.open('separated_channel.wav', 'w')
wav_out.setnchannels(1)
wav_out.setsampwidth(4)
wav_out.setframerate(wave.open('input.wav','r').getframerate())
print "Into separated_channel.wav ", len(vals[1::2]), " frames written."
wav_out.writeframes(vals[1::2].tostring())
if __name__ == '__main__':
fft_compress()
<<<Into fft_compress.wav 500000 frames written.
<<<Into separated_channel.wav 1000000 frames written.
Самое интересное, что не смотря на то, что файл с преобразованием и с исходным каналом имеют разное число фреймов, они имеют одинаковую длительность и размер, при одинаковой частоте семплирования =(
И оба звучат на всю заявленную длину - т.е. мусор в конце них не забит.
что с этим делать ума не приложу.