Я пытаюсь реализовать фильтр нижних частот для приложения iphone, где я записываю звук, а затем он слегка воспроизводится, как голос идет из другой комнаты.
Я рассмотрел различные варианты записи и манипуляции аудио и нашел это немного запутанным... обработка цифрового сигнала не является сильной стороной. Я в основном смотрел OpenAL и внутри EFX-библиотеки есть фильтр, который специально делает то, что мне нужно, но EFX не включен в iPhone. Есть ли способ воспроизвести это поведение с помощью OpenAL для iPhone? Есть ли еще один вариант, например, аудиоустройства, которые могут обеспечить решение?
Спасибо за помощь
EDIT:
Итак, после ответа Тома и ссылок, я придумал то, что, по моему мнению, является правильной реализацией. Тем не менее, я не получаю эффект приглушения вообще, а просто уменьшение объема. Здесь (суммированный) код, который у меня есть:
Файл записывается с использованием 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 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 определенно сглаживает эти значения. Но, как я уже упоминал ранее, я вижу (что мне кажется) сокращение объема, поэтому я могу увеличить коэффициент усиления и отменить то, что я только что сделал.
Кажется, что я должен работать над неправильными значениями. Любые предложения о том, что я делаю неправильно здесь?