我们在使用傅里叶变换的时候,会出现要求截断数据求频率值或则填零求频率。而麻省理工这个3.3.5的库不能够实现填零求超过输入数组长度的值的问题。
譬如以下的情况
代码:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <fftw3.h>
#define PI 3.1415926
using namespace std;
using namespace cv;
int main()
{
double *in = NULL;
// 如果要使用float版本,需先引用float版本的lib库,然后在fftw后面加上f后缀即可.
fftw_complex *out = NULL;// fftwf_complex --> 即为float版本
fftw_plan p;
in = (double *)fftw_malloc(sizeof(double) * 50);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * 26);
float kkk[] = { 0.08, 0.191348, 0.424885
, 0.858924
, 1.55
, 2.52566
, 3.78
, 5.27245
, 6.93
, 8.65269
, 10.3221
, 11.8119
, 13
, 13.7806
, 14.0756
, 13.8443
, 13.09
, 11.863
, 10.26
, 8.41886
, 6.51
, 4.72408
, 3.25745
, 2.29618
, 2 };
// 输入纯实数
for (int i = 0; i < 50; i++)
{
if (i<25) {
in[i] = kkk[i];
}
else {
//in[i] = 0;
}
cout << in[i] << endl;
}
// 傅里叶变换
p = fftw_plan_dft_r2c_1d(50, in, out, FFTW_ESTIMATE);
fftw_execute(p);
// 输出幅度谱
for (int i = 0; i < 9; i++)
{
cout << "out1:" << out[i][0] << endl << "out2:" << out[i][1] << endl;
}
// 释放资源
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
system("pause");
return 0;
}
得到结果:
这里面需要你手动往后面填零:
代码
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <fftw3.h>
#define PI 3.1415926
using namespace std;
using namespace cv;
int main()
{
double *in = NULL;
// 如果要使用float版本,需先引用float版本的lib库,然后在fftw后面加上f后缀即可.
fftw_complex *out = NULL;// fftwf_complex --> 即为float版本
fftw_plan p;
in = (double *)fftw_malloc(sizeof(double) * 50);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * 26);
float kkk[] = { 0.08, 0.191348, 0.424885
, 0.858924
, 1.55
, 2.52566
, 3.78
, 5.27245
, 6.93
, 8.65269
, 10.3221
, 11.8119
, 13
, 13.7806
, 14.0756
, 13.8443
, 13.09
, 11.863
, 10.26
, 8.41886
, 6.51
, 4.72408
, 3.25745
, 2.29618
, 2 };
// 输入纯实数
for (int i = 0; i < 50; i++)
{
if (i<25) {
in[i] = kkk[i];
}
else {
in[i] = 0;
}
cout << in[i] << endl;
}
// 傅里叶变换
p = fftw_plan_dft_r2c_1d(50, in, out, FFTW_ESTIMATE);
fftw_execute(p);
// 输出幅度谱
for (int i = 0; i < 9; i++)
{
cout << "out1:" << out[i][0] << endl << "out2:" << out[i][1] << endl;
}
// 释放资源
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
system("pause");
return 0;
}
结果: