ifft(fft(аудио)) это просто шум

ли я просто вложить их (iff(fft(audio))) или попробовать окно за окном (window аудио, сделать fft, сделать ifft, затем инвертировать окно, заменив ноль на eps, затем объединить сэмплы обратно (пробуя abs здесь и там в трубопроводы)) я получаю только шум.

Я знаю, что ifft является обратным только fft с бесконечной точностью арифметики, бесконечным количеством выборок и т. д. (верно?) Я работаю с 64-битной плавающей запятой и частотой дискретизации 44 кГц. но я ожидаю, что смогу хотя бы услышать исходный звук.

моя ошибка практическая или теоретическая? Я могу дать код, если это ошибка.


person sam boosalis    schedule 29.01.2013    source источник
comment
теоретически вы правы. можешь показать свой код?   -  person Kamyar Souri    schedule 29.01.2013
comment
Это тот случай, когда вы кодируете свои данные обратно в аудио? ifft вернет сложные числа с плавающей запятой. В зависимости от библиотеки, которую вы используете, она может просто сбросить буфер памяти массива на диск в виде .wav без повторного приведения обратно к числам с плавающей запятой. Во всяком случае, это один из способов получить полный мусор в качестве вывода... Попробуйте написать ifft(fft(audio)).real или abs(ifft(fft(audio))) и посмотрите, изменит ли это что-нибудь.   -  person Joe Kington    schedule 29.01.2013
comment
я использовал scipy.io.wavfile.write(). я уже пробовал оба, проблема заключалась в том, чтобы получить правильный dtype (см. ниже).   -  person sam boosalis    schedule 29.01.2013


Ответы (1)


Основываясь на комментарии JoeKington, я скачал этот файл и попробовал следующее:

>>> import scipy.io.wavfile
>>> rate, data = scipy.io.wavfile.read('wahoo.wav')
>>> data
array([134, 134, 134, ..., 124, 124, 124], dtype=uint8)
>>> data_bis = np.fft.ifft(np.fft.fft(data))
>>> data_bis
array([ 134. +6.68519934e-14j,  134. -4.57982480e-14j,
        134. -1.78967708e-14j, ...,  124. -2.09835513e-14j,
        124. -1.61750469e-14j,  124. -2.14867343e-14j])
>>> data_bis = data_bis.astype('uint8')
C:\Users\Jaime y Eva\Desktop\stack_exchange.py:1: ComplexWarning: Casting complex values to real discards the imaginary part
  # -*- coding: utf-8 -*-
>>> data_bis
array([134, 133, 133, ..., 123, 123, 123], dtype=uint8)
>>> scipy.io.wavfile.write('wahoo_bis.wav', rate, data_bis)

И полученный файл воспроизводится точно так же, как исходный.

Таким образом, преобразование возвращаемых комплексных значений в вещественные числа — это только половина проблемы (и вы можете использовать np.abs, а не data.real, как неявно делает приведенный выше код), а затем вам также необходимо преобразовать числа с плавающей запятой в uints соответствующего битовая глубина.

person Jaime    schedule 29.01.2013
comment
моя проблема была в неправильном броске. я изменил «int8» на «uint16». так как я добавлял ноты (читается как .wav) для создания аккордов, я подумал, что должен использовать тот же тип dtype при записи вывода. Нет. ifft и fft обратны, вселенная снова имеет смысл! - person sam boosalis; 29.01.2013