- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有人知道我在哪里可以获得代码或库来执行具有复杂输出的 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]) );
}
}
这是一张显示测试代码的输入和输出的图表:
关于c++ - 具有复杂输出或幅度+相位的 C/C++ Goertzel 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8835806/
所以,我有一个 Triangle->AABB 碰撞算法,我让它返回 AABB 碰撞的三角形。我希望三角形的 3 个 vector 和运动的方向/幅度能让我确定一个偏转 vector ,这样当你以一个角
我希望我能找到一种方法从 python 中的 mp3 中获取振幅数据。与 audacity 类似,但我不想要视觉效果,一个简单的值数组就可以了。当声音变大时,我希望我的代码在某些时候对声音使用reac
在 OpenCV 中,如何计算 Mat 中的平均梯度强度和平均梯度方向? 我已经通过谷歌搜索找到了以下方法,但我想在继续下一步之前确认我确实在正确地执行此操作。 这是正确的吗? Mat img = i
我想在 java 中为麦克风创建一个音频电平表来检查输入的音量。它应该看起来像操作系统之一。我不是在问 gui。它只是计算 产生的字节流中的音频电平 n = targetDataLine.read(
我正在开发一个应用程序,该应用程序既可以录制音频文件,也可以选择在录制完成后播放该文件。 UI 有一个 EQ 组件,该组件相对于当前录音幅度进行动画处理。我已经通过 MediaRecorder.get
我读过两篇关于从 AudioInputStream 中提取样本并将其转换为 dB 的文章。 https://stackoverflow.com/a/26576548/8428414 https://s
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我的目标是在 OpenCV 中获取图像的DFT。 使用 dft 函数,我能够计算它,然后通过计算它的大小来绘制它(然后,应用对数并最终对其进行归一化,以便绘制介于 0 和 1 之间的值) . 我的结果
我正在从事一个 Python 项目,该项目模拟振动弦产生的声音。如果对于给定的字符串,我已经确定了运动的傅里叶变换,则可以通过简单的操作将这些结果更改为显示每个(音频)频率幅度的数据。 是否可以使用
我使用 apache commons 数学库来转换我的音频样本缓冲区上的 FFt 和 IFFT。 FFT 的输出给了我一组复数。频率在中间镜像。样本缓冲区大小为 4096 个样本,我得到 2048 个
我是一名优秀的程序员,十分优秀!