标签: goertzel-algorithm

在C中实现Goertzel算法

我正在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 embedded signal-processing goertzel-algorithm

13
推荐指数
1
解决办法
2万
查看次数

从WAV文件解码DTMF

继我之前的问题之后,我的目标是从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)

c# dtmf goertzel-algorithm

8
推荐指数
1
解决办法
2539
查看次数

使用Goertzel算法处理音频信号的结果

我做了一个小信号处理应用程序.它使用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)

algorithm android signal-processing goertzel-algorithm

4
推荐指数
1
解决办法
4674
查看次数