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