Tag: fft

FFTW高级布局 – inembed = n和inembed = NULL给出不同的结果?

我正在使用FFTW高级数据布局API处理批量2D FFT。 根据FFTW高级复杂DFT文档: 为nembed参数传递NULL等同于传递n 。 但是,当使用inembed = onembed = NULL而不是inembed = onembed = n时,我会得到不同的结果。 什么可能导致结果不匹配? 我们举个例子…… 建立 int howMany = 2; int nRows = 4; int nCols = 4; int n[2] = {nRows, nCols}; float* h_in = (float*)malloc(sizeof(float) * nRows*nCols*howMany); for(int i=0; i<(nRows*nCols*howMany); i++){ //initialize h_in to [0 1 2 3 4 …] h_in[i] = […]

如何在WAV文件数据上执行FFT?

我试图通过检测存在的最高频率来分析文件的音频质量(压缩音频通常会被过滤到低于20KHz的值)。 我正在使用soundstretch库中的类来读取WAV文件数据,该类将PCM样本作为浮点数返回,然后使用fftw3库对这些样本执行FFT。 然后对于每个频率(四舍五入到最接近的KHz),我总计该频率的幅度。 因此,对于不包含16KHz以上频率的低质量文件,我预计在16KHz以上没有振幅或振幅很小,但是我没有得到我期望的结果。 以下是我的代码: #include #include #include #include #include “include/WavFile.h” using namespace std; using namespace soundtouch; #define BUFF_SIZE 6720 #define MAX_FREQ 22//KHz static float freqMagnitude[MAX_FREQ]; static void calculateFrequencies(fftw_complex *data, size_t len, int Fs) { for (int i = 0; i < len; i++) { int re, im; float freq, magnitude; int index; re = […]

KissFFT正向/反向输出噪声,为什么?

我试图在java应用程序中原生使用KissFFT,但输入信号的正向/反向不会按原样返回:信号幅度几乎不存在。 如果我删除比例因子(除以2N),结果就是谐波噪声。 谁能发现这个bug? 这是前转呼叫(从GDX复制,所以应该没问题!): JNIEXPORT void JNICALL Java_com_badlogic_gdx_audio_analysis_KissFFT_spectrum(JNIEnv* env, jclass clazz, jlong handle, jshortArray obj_samples, jfloatArray obj_spectrum) { short* samples = (short*)env->GetPrimitiveArrayCritical(obj_samples, 0); float* spectrum = (float*)env->GetPrimitiveArrayCritical(obj_spectrum, 0); KissFFT* fft = (KissFFT*)handle; kiss_fftr( fft->forwardConfig, (kiss_fft_scalar*)samples, fft->spectrum ); int len = fft->numSamples / 2 + 1; for( int i = 0; i spectrum[i].r) * fft->numSamples; float […]

在C中使用FFTW的高通滤波器

我有一个关于FFT的问题。 我已经设法在C中使用FFTW向前和向后进行FFT。现在,我想应用高通滤波器进行边缘检测,我的一些消息来源说只是将幅度的中心归零。 这是我的输入图片http://sofzh.miximages.com/c/2wnxvfl.jpg 基本上我所做的是: 正向FFT 将输出转换为2D数组 进行FFT移位 当距离中心的距离为高度的25%时,将real和imag值设为0 产生幅度 进行反向FFT移位 转换为1D数组 做后向FFT。 这是原始幅度,处理幅度和结果 http://sofzh.miximages.com/c/aysx9s.png 有人可以帮助我,告诉我哪个部分是错的,以及如何在C中使用FFTW进行高通滤波 谢谢。 源代码: unsigned char **FFT2(int width,int height, unsigned char **pixel, char line1[100],char line2[100], char line3[100],char filename[100]) { fftw_complex* in, * dft, * idft, * dft2; //fftw_complex tmp1,tmp2; fftw_plan plan_f,plan_i; int i,j,k,w,h,N,w2,h2; w = width; h = height; N = w*h; […]

用FFTW计算音频数据的离散傅里叶变换

我对信号处理很陌生,所以请原谅我,如果我吵了一下。 我已经下载并安装了适用于Windows的FFTW。 文档还可以,但我仍然有疑问。 我的总体目标是从计算机上的声卡中捕获以44100采样/秒采样的原始音频数据(此任务已使用库和我的代码实现),然后对此音频数据块执行DFT。 我只对在音频中找到一系列频率成分感兴趣,而且我不会执行任何逆DFT。 在这种情况下,所有必要的是真实到真实的转换,因此fftw_plan_r2r_1d()函数? 我要转换的数据块长度为11025个样本。 我的函数调用如下所示。 这将产生11025个频段的频谱arrays。 我如何知道结果中的最大频率成分? 我相信bin间距是Fs / n,44100/11025,所以4.这是否意味着我将在arrays中从0 Hz一直到44100Hz,步长为4,或者高达一半的频谱奈奎斯特频率22200? 这对我来说是一个问题,因为我只想搜索60Hz到3000Hz的频率。 有没有办法限制变换范围? 我没有看到该函数的任何参数,或者可能还有另一种方法? 非常感谢您提供任何帮助。 p = fftw_plan_r2r_1d(11025, audioData, spectrum, FFTW_REDFT00, FFTW_ESTIMATE);

如何在FFTW库中实现逆实数FFT

我正在尝试用FFT进行一些过滤。 我正在使用r2r_1d计划,我不知道如何进行逆变换… void PerformFiltering(double* data, int n) { /* FFT */ double* spectrum = new double[n]; fftw_plan plan; plan = fftw_plan_r2r_1d(n, data, spectrum, FFTW_REDFT00, FFTW_ESTIMATE); fftw_execute(plan); // signal to spectrum fftw_destroy_plan(plan); /* some filtering here */ /* Inverse FFT */ plan = fftw_plan_r2r_1d(n, spectrum, data, FFTW_REDFT00, FFTW_ESTIMATE); fftw_execute(plan); // spectrum to signal (inverse FFT) fftw_destroy_plan(plan); […]

使用C编程频谱图

我正在尝试用C制作音频频谱图,并考虑使用BASS库: http://www.un4seen.com 。 我在谷歌和这里搜索过,但大多数例子都是用C ++编写的。 如果您对此有任何经验或资源,请提供帮助; 非常感谢。 所以这就是我想要做的: 从麦克风输入读取。 对数据进行采样。 应用短时傅里叶变换。 然后取出幅度并以特定频率绘制它。 像这样的东西: http://upload.wikimedia.org/wikipedia/commons/c/c5/Spectrogram-19thC.png 如果你能提供帮助就会很棒。

向前FFT FFT图像并向后FFT图像以获得相同的结果

我正在尝试使用来自http://www.fftw.org/的库来对图像进行FFT,以便我可以在频域中进行卷积。 但我无法弄清楚如何让它发挥作用。 为了理解如何做到这一点,我试图将FFT图像作为像素颜色数组转发,然后反向FFT,得到相同的像素颜色数组。 这是我做的: fftw_plan planR, planG, planB; fftw_complex *inR, *inG, *inB, *outR, *outG, *outB, *resultR, *resultG, *resultB; //Allocate arrays. inR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); inG = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); inB = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outR = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * width * width); outG = (fftw_complex*) […]

如何以赫兹获得DFT / FFT输出频率?

我想开发音符探测器作为我的学位项目,我想从头开始。 我已经编写了“.wav”文件的代码,该文件从该音频音乐文件中提取所有信息,并为我提供振幅。 然后我为DFT编写了一个代码 – 它给出了一个复数的输出,其中一个轴(实/虚)是幅度/幅度,另一个是相位。 现在问题我想要频率的答案(赫兹不在矢量中)所以我可以检查我的DFT是否给了我正确的输出。 如何将DFT输出转换为频率? 我必须用C语言编写代码,我不想使用任何内置库

WAV文件分析C(libsndfile,fftw3)

我正在尝试开发一个简单的C应用程序,它可以在WAV文件中的给定时间戳下在特定频率范围内给出0-100的值。 示例:我的频率范围为44.1kHz(典型的MP3文件),我想将该范围分成n个范围(从0开始)。 然后我需要得到每个范围的幅度,从0到100。 到目前为止我管理的内容: 使用libsndfile我现在能够读取WAV文件的数据。 infile = sf_open(argv [1], SFM_READ, &sfinfo); float samples[sfinfo.frames]; sf_read_float(infile, samples, 1); 但是,我对FFT的理解相当有限。 但我知道为了使振幅达到我需要的范围是必需的。 但是我该如何继续前进呢? 我找到了FFTW-3库,它似乎适用于此目的。 我在这里找到了一些帮助: https : //stackoverflow.com/a/4371627/1141483 并在这里查看了FFTW教程: http ://www.fftw.org/fftw2_doc/fftw_2.html 但由于我不确定FFTW的行为,我不知道从这里开始。 另一个问题,假设你使用libsndfile:如果强制读取单引导(使用立体声文件)然后读取样本。 那么你真的只会阅读整个文件的一半样本吗? 其中一半来自频道1,还是自动过滤出来? 非常感谢你的帮助。 编辑:我的代码可以在这里看到: double blackman_harris(int n, int N){ double a0, a1, a2, a3, seg1, seg2, seg3, w_n; a0 = 0.35875; a1 = 0.48829; a2 = […]