随时间检测缓冲区中的频率
Detect frequencies in a buffer along the time
如果我将一系列频率的蜂鸣声记录到缓冲区中,例如:
15kHz 持续 50 毫秒,17k 持续 50 毫秒,然后继续,有什么方法可以 "go" 沿时间平原并解码此频率(使用 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;
}
}
我的 Goertzel 就是这样的:
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;
}
如果您知道一组频率和持续时间,那么一组滑动 Goertzel 滤波器是构建简单解调器的良好开端。比较和扫描这些滤波器之间的峰值差异是比仅检查特定幅度输出更好的决策标准。
如果我将一系列频率的蜂鸣声记录到缓冲区中,例如:
15kHz 持续 50 毫秒,17k 持续 50 毫秒,然后继续,有什么方法可以 "go" 沿时间平原并解码此频率(使用 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;
}
}
我的 Goertzel 就是这样的:
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;
}
如果您知道一组频率和持续时间,那么一组滑动 Goertzel 滤波器是构建简单解调器的良好开端。比较和扫描这些滤波器之间的峰值差异是比仅检查特定幅度输出更好的决策标准。