আমি একটি প্লাটফর্মার গেমের সাথে কাজ করছি যাতে বিট সনাক্তকরণ সহ সংগীত অন্তর্ভুক্ত রয়েছে। বর্তমান প্রশস্ততা যখন কোন historicalতিহাসিক নমুনা ছাড়িয়েছে তখন তা পরীক্ষা করে আমি বীটগুলি সনাক্ত করছি। এটি রক এর মতো জেনারগুলির সাথে জেনারগুলির সাথে ভাল কাজ করে না, যা বেশ ধ্রুবক প্রশস্ততাযুক্ত।
সুতরাং আমি আরও তাকাতে এবং এফএফটি ব্যবহার করে একাধিক ব্যান্ডে শব্দটি বিভক্ত অ্যালগরিদমগুলি দেখতে পেলাম ... তারপরে আমি কুলি-টুকি এফএফটি অ্যালগরিদমকে পেয়েছি
আমার একটাই সমস্যা হ'ল আমি অডিওতে বেশ নতুন এবং সিগন্যালটিকে একাধিক সংকেতে বিভক্ত করতে কীভাবে এটি ব্যবহার করব তা আমার কোনও ধারণা নেই।
সুতরাং আমার প্রশ্নটি হ'ল:
সিগন্যালটিকে একাধিক ব্যান্ডে বিভক্ত করতে আপনি কীভাবে এফএফটি ব্যবহার করবেন?
আগ্রহী ছেলেদের জন্যও এটি সি # তে আমার অ্যালগোরিদম is
// 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++;
}
}