Как преобразовать байтовый массив в файл wav <OOURAFFT> - PullRequest
1 голос
/ 15 февраля 2011

Я хочу преобразовать байтовый массив в файл WAV

MyAudioFile  *audioFile = [[MyAudioFile alloc]init];
OSStatus result = [audioFile open:@"MySound" ofType:@"wav"];
int numFrequencies=16384;
int kNumFFTWindows=10;  

OouraFFT *myFFT = [[OouraFFT alloc] initForSignalsOfLength:numFrequencies*2 andNumWindows:kNumFFTWindows];
for(long i=0; i<myFFT.dataLength; i++)
{
    myFFT.inputData[i] = (double)audioFile.audioData[i];    
}

Затем я обрабатываю myFFT.inputData[i], чтобы удалить фоновый шум, но я не знаю, КАК преобразовать myFFT.inputData[i] обратно в WAVфайл.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 16 февраля 2011

Если вы используете БПФ для преобразования данных временной области в данные частотной области, то вы можете использовать обратное БПФ или IFFT для преобразования данных сложной частотной области обратно во временную область.

Если у вас есть только комплексная подпрограмма FFT, то для комплексного вектора X длины N:

IFFT(X) = scale * complexConjugate(FFT(complexConjugate(X)))

где масштаб обычно равен 1 / N, 1 / sqrt (N) или 1,0, в зависимости от коэффициента масштабирования, используемого в прямом БПФ.

Обратите внимание, что заголовок волнового файла также содержит количество каналов. Возможно, вам придется выполнить некоторое (де) чередование данных, а также преобразование типов данных. Endianess также может быть проблемой в зависимости от ISA вашего компьютера.

ДОБАВЛЕНО:

Предполагая подходящий тип данных для каждого образца PCM и соответствующее чередование для стерео / моно, вы можете использовать это описание канонического формата файла .wav (RIFF) для добавления / удаления 44 байтов заголовка: Формат звукового файла WAVE PCM

...