C++学习记录(01)

主要是使用FFTW库进行zfft分析中遇到的问题。

1.FFTW的一般使用程序

参考1
参考2
参考3

void firstfft(complex<double>*input, complex<double>*output, int N,int nf)//第一次fft,一般N<nf
{
   
	fftw_complex*in= (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nf);
	fftw_complex*out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex)*nf);
	fftw_plan p = fftw_plan_dft_1d(nf, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
	int i;
	for (i = 0; i < N; i++) {
   
		in[i][0] = input[i].real();
		in[i][1] = input[i].imag();
	}
	for (i = N; i < nf; i++) {
   
		in[i][0] = 0;
		in[i][1] = 0;
	}
	fftw_execute(p);
	for (i = 0; i < nf; i++) {
   
		output[i].real(out[i][0]);
		output[i].imag(out[i][1]);
	}
	fftw_destroy_plan(p);
	fftw_free(in);
	fftw_free(out);
}

这里使用的是fftw库中一维复数的dft转换。当然在使用该函数前,需要包含头文件fftw3.h还有complex。

参数说明:
n – 复数数据点数
in/out – 输入数据和输出数据,可以相同(原位相同)
sign – FFTW_FORWARD(-1)正变换 FFTW_BACKWORD(+1) 逆变换
flags – 主要有两个参数 FFTW_MEASURE/FFTW_ESTIMATE
FFTW_MEASURE 先进行预处理,对大数据(数据长度不变)连续FFT变化效果明显
FFTW_ESTIMATE 直接构造一个次最优的方案,非连续 实时选择这种方案

另外,与matlab中的fft对应关系可以参考下文:
参考4
最值得注意的应该就是C++中plan_backward时,结果要除以n才可以和matlab中的ifft对应上。而fft不用管,和matlab中的fft是一样的。

2.complex类的使用

C++的complex类使用需要包含头文件complex,fftw中自带fftw_complex类可供使用。
参考5
参考6

参考6.二、1.数据类型中有具体介绍。

可以在变换时使用fftw_complex类,其余时候使用complex类。
complex赋值:
1.采用无名对象方式: c = complex(3.2,-6);
2.初始化时赋值:complex <double> c(3.2,-6);
3.成员函数方式: c[i].real(1);c[i].imag(2);
不可直接写 c[i].real=1
fftw_complex类赋值比较直接:
c[i][0]=1;c[i][1]=2;
这里的0位代表实部,1代表虚部。

3.for循环的多个条件

参考7
结论:for循环中,当不用&&和||申明多个条件时,默认的是或者关系。

4.new和delete

参考8
未知所需的内存空间时,可以用new来创建变量。
C++中不允许int a[n],但可以用

      int*a=new int [n];

在使用数组完毕后,可用指令释放它所占用的内存,如

      delete[]a;

使用时要注意new和delete一般搭配使用,否则容易造成内存泄漏(即无用的数据过多,影响程序的运行速度)。

5.随机数组产生

参考9

void random(double*out, int n)
{
   
	srand(time(0));  //设置时间种子
	double*a = new double[n];
	int i;
	for (int i = 0; i < n; i++) {
   
		a[i] = rand() % (1001);//生成区间0~1000的随机数 
	}
	for (i = 0; i < n; i++) {
   
		out[i] = a[i] * 0.001;
	}
	delete[]a;
}

6.成品
在main中实现了zfft(细化谱分析),但最后一个fft,即fftagain出来的数据与matlab中的不一样,还不知道原因。知道了再更新一下!

#include<iostream>
#include <math.h>//头文件
#include <cmath>
#include<complex>
#include <fftw3.h>
#include <cstdlib> 
#include <ctime>
using namespace std;

int main()
{
   
	void zfft(double *x, complex<double>*y, double fi, int fs, int length, int nf, int nfft, int np);
	void random(double*out, int n);
	void 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值