Vuruş algılamalı müzik içeren bir platform oyunu üzerinde çalışıyorum. Şu anda mevcut genliğin tarihsel bir örneği aştığında kontrol ederek atımları tespit ediyorum. Bu, oldukça sabit bir genliğe sahip olan rock gibi müzik türleriyle iyi çalışmaz.
Bu yüzden daha ileriye baktım ve sesi FFT kullanarak birden fazla banda bölen algoritmalar buldum ... sonra Cooley-Tukey FFt algoritmasını buldum
Sahip olduğum tek sorun, ses için oldukça yeni olduğum ve bunu sinyali birden fazla sinyale bölmek için nasıl kullanacağım hakkında hiçbir fikrim yok.
Benim sorum şu:
Bir sinyali birden fazla banda bölmek için FFT'yi nasıl kullanırsınız?
Ayrıca ilgilenen çocuklar için bu c # benim algoritması:
// 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++;
}
}