Форум сайта python.su
Я читаю 2-х канальный wav файл, выделяю один канал выполняю обратное от прямого его(канала) преобразования фурье, записываю в файл.
По непонятной причине результат получившийся после фурье преобразований звучит медленно, при этом исходный звук сильно зашумлен. Нормальный звук получается только если убрать все нечетные или четные значения из результата.
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.
Офлайн
Хм. Ну… видимо дело в фурье преобразовании. Я даже незнаю… попросить тебя код показать или нет… ;)
Ты как его делаешь?
Отредактировано (Сен. 3, 2008 14:33:20)
Офлайн
ох, я забыл добавить импорты. я использую стандартное fft из библиотеки
numarray. “на глаз” участки графиков исходного и преобразованного сигнала не различимы, однако не сливаются в один цвет - т.е. ошибка что-то порядка 1-2% есть. Это может объяснить шумы, но ни как не проблемы с количеством записанных фреймов =)
import wave, Numeric, array, pylab
import numarray.fft as fft
from math import *
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.
Офлайн
$m1tЧестно говоря с преобразованием Фурье не имел дела с института :( Но вот не с этим ли связано удвоение:
Это может объяснить шумы, но ни как не проблемы с количеством записанных фреймов =)
real_fft(a, n=None, axis=-1)
Will return the n point discrete Fourier transform of the real valued array a; n defaults to the length of a. It is most efficient for n a power of two. The returned array will be one half of the symmetric complex transform of the real array.
Офлайн