Фильтр нижних частот iphone

Я пытаюсь реализовать фильтр нижних частот для приложения iphone, где я записываю звук, а затем он воспроизводится слегка приглушенным; как будто голос идет из другой комнаты.

Я изучил различные варианты аудиозаписи и манипуляции с ними и обнаружил, что это немного сбивает с толку ... цифровая обработка сигналов вообще не является сильной стороной. В основном я изучал OpenAL, и внутри библиотеки EFX есть фильтр, который делает именно то, что мне нужно, но EFX не включен в iPhone. Есть ли способ воспроизвести это поведение с помощью OpenAL для iPhone? Есть ли другой вариант, такой как Audio Units, который мог бы предоставить решение?

Спасибо за вашу помощь

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'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 определенно выравнивает эти значения. Но, как я уже упоминал ранее, я вижу только (что мне кажется) уменьшение громкости, поэтому я могу увеличить усиление и отменить то, что я только что сделал.

Кажется, я должен работать на неправильные значения. Есть какие-нибудь предположения о том, что я здесь делаю неправильно?

13
задан swingdoctor 15 January 2011 в 13:24
поделиться