使用fftw对音频进行fft及ifft

在项目中需要提取音频中特定频率,需要使用fft和ifft,fftw满足要求。需要注意的地方是在做ifft后要做归一化处理,代码如下:

// fft.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <math.h>
#include <windows.h>

#include "fftw3.h"
#pragma comment(lib, "libfftw3-3.lib") // double版本
// #pragma comment(lib, "libfftw3f-3.lib")// float版本
// #pragma comment(lib, "libfftw3l-3.lib")// long double版本

int main(void)
{
	double array[] = { 0.1, 0.6, 0.1, 0.4, 0.5, 0, 0.8, 0.7, 0.8, 0.6, 0.1 };
	double *out;
	double *err;
	int i, size = 10;

	fftw_complex *out_cpx;

	fftw_plan fft;
	fftw_plan ifft;
	out_cpx = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*size);
	out = (double *)malloc(size * sizeof(double));
	err = (double *)malloc(size * sizeof(double));

	fft = fftw_plan_dft_r2c_1d(size, array, out_cpx, FFTW_ESTIMATE);  //Setup fftw plan for fft
	ifft = fftw_plan_dft_c2r_1d(size, out_cpx, out, FFTW_ESTIMATE);   //Setup fftw plan for ifft

	fftw_execute(fft);
	fftw_execute(ifft);

	//printf("Input:    \tOutput:    \tError:\n");
	printf("Input:    \tOutput:\n");
	for (i = 0; i<size; i++)
	{
		err[i] = (array[i] - out[i]);
		printf("%f\t%f\n", (array[i]), out[i]/size);//需要做归一化处理
		//printf("%f\t%f\t%f\n",(array[i]),out[i],err[i]);
	}

	fftw_destroy_plan(fft);
	fftw_destroy_plan(ifft);
	fftw_free(out_cpx);
	free(err);
	free(out);
	return 0;
}

完整工程请点击下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值