Я пытаюсь реализовать фильтр нижних частот для приложения для iphone, где я записываю звук, а затем он воспроизводится слегка приглушенным;как будто голос идет из другой комнаты.
Я рассмотрел различные варианты записи звука и манипулирования и нашел его немного запутанным ... цифровая обработка сигналов вовсе не является сильной стороной.Я в основном изучал OpenAL, и внутри библиотеки EFX есть фильтр, который делает именно то, что мне нужно, но EFX не включен в iPhone.Есть ли способ воспроизвести это поведение с помощью OpenAL для iPhone?Есть ли другой вариант, такой как Аудиоустройства, который может предоставить решение?
Спасибо за вашу помощь
РЕДАКТИРОВАТЬ:
Так что после ответа Тома и ссылок, я пришелс тем, что я считаю правильной реализацией.Тем не менее, я не получаю приглушающего эффекта, а просто уменьшаю громкость.Вот (обобщенный) код, который у меня есть на данный момент:
Файл записывается с использованием AVAudioRecorder и следующих настроек:
[recordSetting setValue :[NSNumber numberWithInt:kAudioFormatLinearPCM] forKey:AVFormatIDKey];
[recordSetting setValue:[NSNumber numberWithFloat:44100] forKey:AVSampleRateKey];
[recordSetting setValue:[NSNumber numberWithInt: 1] forKey:AVNumberOfChannelsKey];
[recordSetting setValue :[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsBigEndianKey];
[recordSetting setValue :[NSNumber numberWithBool:NO] forKey:AVLinearPCMIsFloatKey];
Затем я читаю в файле и преобразую его с помощью кода ниже:
// Read in the file using AudioFileOpenURL
AudioFileID fileID = [self openAudioFile:filePath];
// find out how big the actual audio data is
UInt32 fileSize = [self audioFileSize:fileID];
// allocate the memory to hold the file
SInt16 * outData = (SInt16 *)malloc(fileSize);
// Read in the file to outData
OSStatus result = noErr;
result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);
// close off the file
AudioFileClose(fileID);
// Allocate memory to hold the transformed values
SInt16 * transformData = (SInt16 *)malloc(fileSize);
// Start the transform - Need to set alpha to 0.15 or below to have a noticeable affect
float alpha = 1;
// Code as per Tom's example
transformData[0] = outData[0];
for(int sample = 1; sample < fileSize / sizeof(SInt16); sample ++)
{
transformData[sample] = transformData[sample - 1] + alpha * (outData[sample] - transformData[sample - 1]);
}
// Add the data to OpenAL buffer
NSUInteger bufferID;
// grab a buffer ID from openAL
alGenBuffers(1, &bufferID);
// Add the audio data into the new buffer
alBufferData(bufferID,AL_FORMAT_MONO16,transformData,fileSize,44100);
Итак, после этого я проигрываю его через OpenAL, используя стандартный метод (я не думаю, что это повлияет на мои результаты, поэтому я не буду его сюда включать).
Я проследил результаты как до, так и после преобразования, и они кажутся мне правильными, то есть значения до меняются положительно и отрицательно, как я и ожидал, и цикл for определенно выравнивает эти значения.Но, как я упоминал ранее, я вижу только (что мне кажется) уменьшение громкости, поэтому я могу увеличить усиление и отменить то, что я только что сделал.
Кажется, что ядолжно работать на неправильных значениях.Любые предложения о том, что я делаю здесь не так?