gpt4 book ai didi

c++ - 具有复杂输出或幅度+相位的 C/C++ Goertzel 算法?

转载 作者:太空狗 更新时间:2023-10-29 21:27:37 26 4
gpt4 key购买 nike

有人知道我在哪里可以获得代码或库来执行具有复杂输出的 Goertzel 算法吗?(或任何其他 1-bin-DFT 算法?)

最佳答案

以下是我几年前为此编写的代码。随意使用它,并附上适当的归属。

goertzelfilter.h

/* goertzelfilter.h
*/

#ifndef GOERTZELFILTER_H_
#define GOERTZELFILTER_H_

#include <complex.h>

typedef struct goertzelfilterstruct {
double coeff ;
double sine ;
double cosine ;
} GoertzelFilter;

GoertzelFilter goertzelSetup( double normalizedfreq );

double complex goertzelFilterC( double *sample, int nsamples, GoertzelFilter *g );

#endif

goerzelfilter.c

/* goertzelfilter.c
*/

#include <math.h>
#include <stdlib.h>
#include <complex.h>

#include "goertzelfilter.h"

GoertzelFilter goertzelSetup( double normalizedfreq )
{
double w = 2*M_PI*normalizedfreq;
double wr, wi;

GoertzelFilter g;

wr = cos(w);
wi = sin(w);
g.coeff = 2 * wr;
g.cosine = wr;
g.sine = wi;

return g;
}

double complex goertzelFilterC( double *samples, int nsamples, GoertzelFilter *g )
{
double sprev = 0.0;
double sprev2 = 0.0;
double s, imag, real;
int n;

for (n=0; n<nsamples; n++ ) {
s = samples[n] + g->coeff * sprev - sprev2;
sprev2 = sprev;
sprev = s;
}

real = sprev*g->cosine - sprev2;
imag = -sprev*g->sine;

return real + I*imag;
}

为了测试,你可以试试这个,

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>

#include "goertzelfilter.h"

#define LEN(a) (sizeof(a)/sizeof(a[0]) )

int main() {

// This will hold our input and output data
double data[1024] = { 0. };
double complex filtered[1024] = { 0. };

// This will hold the filter constants
GoertzelFilter g = { 0. };

int n;
int nwindow = 16;

double f = 4./LEN(data) ;

// Generate data with noise
for ( n = 0 ; n < LEN(data) ; n++ ) {
data[n] = sin( n * (2.*M_PI) * f ) + 0.5*((float)rand()/RAND_MAX - 0.5);
}

// Set up the filter constants, note that we choose a frequency
g = goertzelSetup( f );

// Filter the data using a sliding window
for( n = 0 ; n < LEN(data)-nwindow ; n++ ) {
filtered[n+nwindow/2] = goertzelFilterC( &data[n], nwindow, &g )/nwindow;
}

// Print the real Valued Data (1st column) and complex valued Goertzel output
for( n = 0 ; n < LEN(data); n++ ) {
printf( "%g %g %g\n", data[n], creal(filtered[n]), cimag(filtered[n]) );
}

}

这是一张显示测试代码的输入和输出的图表:

enter image description here

关于c++ - 具有复杂输出或幅度+相位的 C/C++ Goertzel 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com