我正在DSP处理器上实现BFSK跳频通信系统.一些论坛成员建议使用Goertzel算法来解调特定频率的跳频.我已经尝试在C中实现goertzel算法.代码如下:
float goertzel(int numSamples,int TARGET_FREQUENCY,int SAMPLING_RATE, float* data)
{
int k,i;
float floatnumSamples;
float omega,sine,cosine,coeff,q0,q1,q2,result,real,imag;
floatnumSamples = (float) numSamples;
k = (int) (0.5 + ((floatnumSamples * TARGET_FREQUENCY) / SAMPLING_RATE));
omega = (2.0 * M_PI * k) / floatnumSamples;
sine = sin(omega);
cosine = cos(omega);
coeff = 2.0 * cosine;
q0=0;
q1=0;
q2=0;
for(i=0; i<numSamples; i++)
{
q0 = coeff * q1 - q2 + data[i];
q2 = q1;
q1 = q0;
}
real = (q1 - q2 * cosine);
imag …Run Code Online (Sandbox Code Playgroud) 继我之前的问题之后,我的目标是从C#中检测WAV文件中的DTMF音调.但是,我真的很难理解如何做到这一点.
我知道DTMF使用频率组合,并且可以使用Goertzel算法......不知何故.我抓住了一个Goertzel代码片段,我尝试将.WAV文件推入其中(使用NAudio读取文件,这是一个8KHz单声道16位PCM WAV):
using (WaveFileReader reader = new WaveFileReader(@"dtmftest_w.wav"))
{
byte[] buffer = new byte[reader.Length];
int read = reader.Read(buffer, 0, buffer.Length);
short[] sampleBuffer = new short[read/2];
Buffer.BlockCopy(buffer, 0, sampleBuffer, 0, read/2);
Console.WriteLine(CalculateGoertzel(sampleBuffer,8000,16));
}
public static double CalculateGoertzel(short[] sample, double frequency, int samplerate)
{
double Skn, Skn1, Skn2;
Skn = Skn1 = Skn2 = 0;
for (int i = 0; i < sample.Length; i++)
{
Skn2 = Skn1;
Skn1 = Skn;
Skn = 2 * Math.Cos(2 * Math.PI * …Run Code Online (Sandbox Code Playgroud) 我做了一个小信号处理应用程序.它使用Goerztel算法处理特定频率的音频信号(莫尔斯码).应用程序将临时文件保存到文件系统,记录完成后,开始检测信号.现在我得到了一堆数量的结果.
我真的不知道从那些量级中读到什么.如何从这些量级解码摩尔斯电码?我怎么读它们?试图找到参考,但没有解释什么是结果以及如何阅读它.
编辑:
我的摩尔斯电码应用程序是用Delphi编写的,并使用Windows Beep函数以特定频率发送信号.我使用1200赫兹的信号.信号和单词之间也会暂停,莫尔斯的哔哔声就像维基百科所描述的那样.一切都准确.
Goertzel.java:
public class Goertzel {
private float samplingRate;
private float targetFrequency;
private int n;
private double coeff, Q1, Q2;
private double sine, cosine;
public Goertzel(float samplingRate, float targetFrequency, int inN) {
this.samplingRate = samplingRate;
this.targetFrequency = targetFrequency;
n = inN;
sine = Math.sin(2 * Math.PI * (targetFrequency / samplingRate));
cosine = Math.cos(2 * Math.PI * (targetFrequency / samplingRate));
coeff = 2 * cosine;
}
public void resetGoertzel() {
Q1 = 0;
Q2 = 0;
} …Run Code Online (Sandbox Code Playgroud)