Какие значения я должен вычислить из FFT двух аудио файлов и сравнить его, чтобы показать, что они равны? - PullRequest
1 голос
/ 26 октября 2010

Я хочу сравнить два аудиофайла (запись голоса) и определить, являются ли они идентичными или нет (в некоторой степени). Я придумала FFT (OouraFFT). Я интегрировала код и передала свой аудиофайл в качестве входных данных и Вызывается "CalculateWelchPeriodogramWithNewSignalSegment". В методе "CalculateWelchPeriodogramWithNewSignalSegment" используются данные о спектре. Что мне следует использовать для сравнения двух звуковых файлов. мне следует продолжить? Любая ценная информация будет более полезной. Заранее спасибо.

EDIT:

 MyAudioFile  *audioFile = [[MyAudioFile alloc]init];
OSStatus result = [audioFile open:var 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 calculateWelchPeriodogramWithNewSignalSegment];
NSLog(@"the spectrum data 1 is  %f ",myFFT.spectrumData[1]);
NSLog(@"the spectrum data 2 is  %f",myFFT.spectrumData[2]);
    NSLog(@"the spectrum data 8192 is  %f ",myFFT.spectrumData[8192]);

Я создал класс MyAudioFile, который содержит

-(OSStatus)open:(NSString *)fileName ofType:(NSString *)fileType{
OSStatus result = -1;

CFStringRef filePath=fileName;

CFURLRef audioFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, (CFStringRef)filePath, kCFURLPOSIXPathStyle, false);
//open audio file
result = AudioFileOpenURL (audioFileURL, kAudioFileReadPermission, 0, &mAudioFile);
if (result == noErr) {
    //get  format info
    UInt32 size = sizeof(mASBD);

    result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyDataFormat, &size, &mASBD);

    UInt32 dataSize = sizeof packetCount;
    result = AudioFileGetProperty(mAudioFile, kAudioFilePropertyAudioDataPacketCount, &dataSize, &packetCount);
    NSLog([NSString stringWithFormat:@"File Opened, packet Count: %d", packetCount]);

    UInt32 packetsRead = packetCount;
    UInt32 numBytesRead = -1;
    if (packetCount > 0) { 
        //allocate  buffer
        audioData = (SInt16*)malloc( 2 *packetCount);
        //read the packets
        result = AudioFileReadPackets (mAudioFile, false, &numBytesRead, NULL, 0, &packetsRead,  audioData); 
        NSLog([NSString stringWithFormat:@"Read %d  bytes,  %d packets", numBytesRead, packetsRead]);
    }
}
else
    NSLog([NSString stringWithFormat:@"Could not open file: %@", filePath]);


CFRelease (audioFileURL);     
return result;
}

Я думаю, теперь я закончил с БПФ, myFFT.spectrumData [i] имеет сэмплированные выходные значения, отличающиеся от i.

Хочу ли я сейчас прекратить это и интегрировать Accelerate framework для выполнения FFT. Я в замешательстве. Скажите, пожалуйста, какой из них использовать?

Ответы [ 3 ]

4 голосов
/ 28 октября 2010

Это на самом деле довольно сложная проблема, но я бы сказал, что работа в частотном пространстве полезна.Кроме того, как автор библиотеки OouraFFT (обертка ObjC вокруг довольно старой реализации FFT профессора Оуры), я бы рекомендовал НЕ использовать ее, если вместо этого вы можете использовать библиотеку Apple Accelerate.Это намного быстрее, точнее и будет активно поддерживаться.Моя библиотека не будет, я полностью переключился на Ускорение для моей собственной работы.

Anyhoo, это полезно для работы в частотном пространстве, потому что любое небольшое смещение во временной области вызовет у вас много головной боли, когдаработа с взаимными корреляциями.Если вместо этого вы выполните кратковременное преобразование Фурье , вы можете применить методы, опубликованные инженерами приложения Shazam для iPhone , которые, на первый взгляд, кажутся устойчивыми к этому.проблема.Желаю удачи, у вас впереди много работы.

3 голосов
/ 26 октября 2010

Я не уверен, что FFT - это то, что вы хотели бы использовать в этом сценарии. БПФ предоставит вам спектральную плотность мощности (PSD) сигнала. Это означает, что вы получите график мощности сигнала стихов частоты. Обратите внимание, что там нет времени. Другими словами, вы сможете сравнивать, только если сигналы имеют одинаковое распределение частот, но не в том случае, если сигналы во временной области идентичны. Для этого я думаю, что вы хотели бы использовать что-то более похожее на взаимную корреляцию, которая измеряет сходство двух волновых форм за определенный промежуток времени и дает вам оценку того, насколько они похожи. Могут быть и более сложные способы сделать это, но это не в моей голове.

-Эрик

1 голос
/ 13 февраля 2012

Вы столкнетесь с проблемами при любом прямом сравнении этих двух волновых файлов - шум, разные голоса и т. Д. Все усложнят. Я, вероятно, попытался бы выполнить взаимную корреляцию в частотном спектре (то есть после запуска FFT), ища образцы частотных пиков (так как они не будут идентичны - разные люди имеют разные высоты голоса и говорят с разной скоростью .)

Итак, для уточнения: получите величину вашего БПФ (боюсь, я не знаком с OouraFFT, поэтому я не уверен, как хранятся сложные значения). Запустите взаимную корреляцию между ними. Если максимальная корреляция больше какого-либо параметра, это совпадение.

...