たとえば、一連の周波数のビープ音をバッファに記録すると、次のようになります。
50 ミリ秒で 15kHz、50 ミリ秒で 17k と続きますが、タイム プレーンに沿って「移動」し、この周波数を (goertzel などで) デコードする方法はありますか?
ねえ、これは更新です。チェックするサウンド バッファー内の最初の区切り文字を見つける方法を示すコードを追加しました。5 秒間のバッファを記録すると (ファイルではなくストリーム バッファに記録します)、最初のスニペットは、開始区切り文字が始まるインデックスを分析するのに 30 秒ほどかかります。私はそれが非常に初心者だと思います...より良い解決策を見つけなければなりません。ありがとうございます (すべての区切り文字は 0.2 秒の長さです) 開始区切り文字 = 12KHz、1's = 13k、0's = 14k、終了区切り文字 = 15k です。
double max_power = 0;
int max_power_index = 0;
double DelimiterSamplesCount = SampleRate * DelimiterTime;
float[] samples32array = samples32.ToArray();
//Searching For Delimiter
for (int i = 0; i < (samples32array.Length); i++) //Delimiter Samples Length = SampleRate*DelimiterTimeLength,( i.e: 44100*0.2=8820 samples)
{
if ((i + (int)DelimiterSamplesCount - 1) > samples32array.Length) break;
double power = Goertzel.GoertzelFilter(samples32array, StartDelimiterFreq, i, i + (int)DelimiterSamplesCount - 1);
if(power > max_power)
{
max_power = power;
max_power_index = i;
}
}
私のゲルツェルはこんな感じです:
public static double GoertzelFilter(float[] samples, double freq, int start, int end)
{
double sPrev = 0.0;
double sPrev2 = 0.0;
int i;
double normalizedfreq = freq / 44100;
double coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);
for (i = start; i < end; i++)
{
double s = samples[i] + coeff * sPrev - sPrev2;
sPrev2 = sPrev;
sPrev = s;
}
double power = sPrev2 * sPrev2 + sPrev * sPrev - coeff * sPrev * sPrev2;
return power;
}