मैं एक प्लेटफ़ॉर्मर गेम पर काम कर रहा हूं जिसमें बीट डिटेक्शन वाला संगीत शामिल है। मैं वर्तमान में एक ऐतिहासिक नमूने से अधिक होने पर धड़कन का पता लगा रहा हूं। यह रॉक की तरह संगीत की शैलियों के साथ अच्छी तरह से काम नहीं करता है, जिसमें एक बहुत स्थिर आयाम है।
इसलिए मैंने आगे देखा और पाया कि एल्गोरिदम एफएफटी का उपयोग करके कई बैंडों में ध्वनि को विभाजित कर रहा था ... फिर मुझे कॉली-टके एफएफटी एल्गोरिथ्म मिला
एकमात्र समस्या यह है कि मैं ऑडियो के लिए काफी नया हूं और मुझे पता नहीं है कि सिग्नल को कई सिग्नल में विभाजित करने के लिए इसका उपयोग कैसे करें।
तो मेरा सवाल है:
सिग्नल को कई बैंड में विभाजित करने के लिए आप एफएफटी का उपयोग कैसे करते हैं?
इसके अलावा रुचि रखने वालों के लिए, यह c # में मेरा एल्गोरिथ्म है:
// C = threshold, N = size of history buffer / 1024
public void PlaceBeatMarkers(float C, int N)
{
List<float> instantEnergyList = new List<float>();
short[] samples = soundData.Samples;
float timePerSample = 1 / (float)soundData.SampleRate;
int sampleIndex = 0;
int nextSamples = 1024;
// Calculate instant energy for every 1024 samples.
while (sampleIndex + nextSamples < samples.Length)
{
float instantEnergy = 0;
for (int i = 0; i < nextSamples; i++)
{
instantEnergy += Math.Abs((float)samples[sampleIndex + i]);
}
instantEnergy /= nextSamples;
instantEnergyList.Add(instantEnergy);
if(sampleIndex + nextSamples >= samples.Length)
nextSamples = samples.Length - sampleIndex - 1;
sampleIndex += nextSamples;
}
int index = N;
int numInBuffer = index;
float historyBuffer = 0;
//Fill the history buffer with n * instant energy
for (int i = 0; i < index; i++)
{
historyBuffer += instantEnergyList[i];
}
// If instantEnergy / samples in buffer < instantEnergy for the next sample then add beatmarker.
while (index + 1 < instantEnergyList.Count)
{
if(instantEnergyList[index + 1] > (historyBuffer / numInBuffer) * C)
beatMarkers.Add((index + 1) * 1024 * timePerSample);
historyBuffer -= instantEnergyList[index - numInBuffer];
historyBuffer += instantEnergyList[index + 1];
index++;
}
}