我目前正在開發一個程序,用於分析演奏樂器的獨奏音樂家的wav文件並檢測其中的音符。要做到這一點,它執行FFT,然後查看生成的數據。目標是(在某個時候)通過編寫MIDI文件來製作樂譜。活頁樂譜的音頻分析
我只想就什麼可能會有困難,不管是否有人嘗試過,也許有些事情是很好的研究。目前我最大的困難是,並不是所有的音符都是純粹的一個頻率,我還不能檢測到和絃;只是單一的筆記。還有,我正在檢測的音符之間有一段暫停,所以我確定一個音樂已經結束,另一個開始。對此的任何評論也將非常歡迎!
這是我使用的代碼,當一個新的幀來自信號。它會尋找樣本中最主要的頻率:
//Get frequency vector for power match
double[] frequencyVectorDoubleArray = Accord.Audio.Tools.GetFrequencyVector(waveSignal.Length, waveSignal.SampleRate);
powerSpectrumDoubleArray[0] = 0; // zero DC
double[,] frequencyPowerDoubleArray = new double[powerSpectrumDoubleArray.Length, 2];
for (int i = 0; i < powerSpectrumDoubleArray.Length; i++)
{
if (frequencyVectorDoubleArray[i] > 15.00)
{
frequencyPowerDoubleArray[i, 0] = frequencyVectorDoubleArray[i];
frequencyPowerDoubleArray[i, 1] = powerSpectrumDoubleArray[i];
}
}
//Method for finding the highest frequency in a sample of frequency domain data
//But I want to filter out stuff
pulsePowerDouble = lowestPowerAcceptedDouble;//0;//lowestPowerAccepted;
int frequencyIndexAtPulseInt = 0;
int oldFrequencyIndexAtPulse = 0;
for (int j = 0; j < frequencyPowerDoubleArray.Length/2; j++)
{
if (frequencyPowerDoubleArray[j, 1] > pulsePowerDouble)
{
oldPulsePowerDouble = pulsePowerDouble;
pulsePowerDouble = frequencyPowerDoubleArray[j, 1];
oldFrequencyIndexAtPulse = frequencyIndexAtPulseInt;
frequencyIndexAtPulseInt = j;
}
}
foundFreq = frequencyPowerDoubleArray[frequencyIndexAtPulseInt, 0];
你有任何代碼可以告訴我們嗎? – 2011-05-28 23:53:19
當然。將張貼。 – Nyx 2011-05-29 00:46:59
請參閱http://stackoverflow.com/questions/435533/detecting-the-fundamental-frequency – mtrw 2011-05-29 02:00:03