Найти - Пользователи
Полная версия: Странное поведение при записи в wav файл.
Начало » Python для экспертов » Странное поведение при записи в wav файл.
1
$m1t
Я читаю 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.
Так же в еще один файл пишется исходный канал без изменений.
Самое интересное, что не смотря на то, что файл с преобразованием и с исходным каналом имеют разное число фреймов, они имеют одинаковую длительность и размер, при одинаковой частоте семплирования =(

И оба звучат на всю заявленную длину - т.е. мусор в конце них не забит.
что с этим делать ума не приложу.
shiza
Хм. Ну… видимо дело в фурье преобразовании. Я даже незнаю… попросить тебя код показать или нет… ;)
Ты как его делаешь?
$m1t
ох, я забыл добавить импорты. я использую стандартное 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.
PooH
$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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB