Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 2, 2008 22:00:12

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при записи в wav файл.

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

И оба звучат на всю заявленную длину - т.е. мусор в конце них не забит.
что с этим делать ума не приложу.



Офлайн

#2 Сен. 3, 2008 14:31:55

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при записи в wav файл.

Хм. Ну… видимо дело в фурье преобразовании. Я даже незнаю… попросить тебя код показать или нет… ;)
Ты как его делаешь?



Отредактировано (Сен. 3, 2008 14:33:20)

Офлайн

#3 Сен. 4, 2008 22:50:15

$m1t
От:
Зарегистрирован: 2006-12-31
Сообщения: 104
Репутация: +  0  -
Профиль   Отправить e-mail  

Странное поведение при записи в wav файл.

ох, я забыл добавить импорты. я использую стандартное 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.



Офлайн

#4 Сен. 5, 2008 05:54:50

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Странное поведение при записи в wav файл.

$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.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version