自己写的一个关于FFTW包的1维FFTIFFT的C++类 Wrap

Python017

自己写的一个关于FFTW包的1维FFTIFFT的C++类 Wrap,第1张

如题:

.h 文件

.cpp 实现

'''c++

DFT_1D_TASK::DFT_1D_TASK()

{

    Nfft  = 0

    _fftIn  = nullptr

    _fftOut = nullptr

}

DFT_1D_TASK::DFT_1D_TASK(size_t N)

{

    Nfft = N

    _fftIn =  fftw_alloc_complex(Nfft)

    _fftOut = fftw_alloc_complex(Nfft)

    _fftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_FORWARD, FFTW_ESTIMATE)

    _ifftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_BACKWARD, FFTW_ESTIMATE)

}

void DFT_1D_TASK::ResetNfft(size_t N)

{

    ClearBuffer()

    Nfft = N

    _fftIn =  fftw_alloc_complex(Nfft)

    _fftOut = fftw_alloc_complex(Nfft)

    _fftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_FORWARD, FFTW_ESTIMATE)

    _ifftPlan = fftw_plan_dft_1d(static_cast(Nfft), _fftIn, _fftOut, FFTW_BACKWARD, FFTW_ESTIMATE)

}

DFT_1D_TASK::~DFT_1D_TASK()

{

    ClearBuffer()

}

bool DFT_1D_TASK::DFT_R2C(const vector &input, vector>&output){

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i]

        _fftIn[i][1] = 0

    }

    fftw_execute(_fftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0])

        output[i].imag( _fftOut[i][1])

    }

    return true

}

bool DFT_1D_TASK::IDFT_C2R(const vector>&input, vector &output)

{

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_ifftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i] = _fftOut[i][0]/Nfft

    }

    return true

}

bool DFT_1D_TASK::DFT_C2C (const vector>&input, vector>&output)

{

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_fftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0])

        output[i].imag( _fftOut[i][1])

    }

    return true

}

bool DFT_1D_TASK::IDFT_C2C(const vector>&input, vector>&output){

    if(input.size()!= this->Nfft)

        return false

    for(size_t i = 0i

        _fftIn[i][0] = input[i].real()

        _fftIn[i][1] = input[i].imag()

    }

    fftw_execute(_ifftPlan)

    if(output.size()!=this->Nfft)

        output.resize(Nfft)

    for(size_t i = 0i<(Nfft)i++)

    {

        output[i].real( _fftOut[i][0]/Nfft)

        output[i].imag( _fftOut[i][1]/Nfft)

    }

    return true

}

void DFT_1D_TASK::ClearBuffer()

{

    if(_fftIn != nullptr)

        fftw_free(_fftIn)

    if(_fftOut != nullptr)

        fftw_free(_fftOut)

    fftw_destroy_plan(_fftPlan)

    fftw_destroy_plan(_ifftPlan)

}

'''

#include <stdio.h>

#define N 7 /*叶子数目,需要时更改此值即可*/

#define M 2*N-1 /*节点总数*/

typedef struct

{

char bits[N]/*编码存储,位串*/

int start/*编码在位串中的位置*/

}codetype

typedef struct

{

float weight

int lchild,rchild,parent

}hufmtree

void HUFFMAN(tree1)

hufmtree tree1[]

{

int i,j,p1,p2

float small1,small2,f

hufmtree *tree

tree=tree1

for(i=0i<Mi++) /*初始化*/

{

tree[i].parent=0

tree[i].lchild=0

tree[i].rchild=0

tree[i].weight=0.0

}

printf("please input a possible data weight:\n")/*输入信源数据*/

for(i=0i<Ni++) /*输入前n个节点的权值*/

{

scanf("%f",&f)

tree[i].weight=f

}

for(i=Ni<Mi++) /* 进行n-1次合并,产生n-1个新的节点*/

{

p1=0,p2=0

small1=1small2=1

for(j=0j<=i-1j++) /*从所有的节点中,选出两个权值最小的根节点*/

if(tree[j].parent==0) /*parent值为0,则显示根节点,否则便是非根节点*/

if(tree[j].weight<small1)

{

small2=small1/*改变最小权,次小权及对应的位置*/

small1=tree[j].weight

p2=p1/*p1、p2记住这两个根节点在向量tree中的下标*/

p1=j

}

else if(tree[j].weight<small2)

{

small2=tree[j].weight/*次小权及位置*/

p2=j

}

tree[p1].parent=i+1/*节点分量与下标之间差值为1*/

tree[p2].parent=i+1/*节点的标号i+1*/

tree[i].lchild=p1+1/*最小值根节点是新节点的左孩子,分量标号是其下标加1*/

tree[i].rchild=p2+1/*次小权根节点是新节点的右孩子*/

tree[i].weight=tree[p1].weight+tree[p2].weight

}

}/*HUFFMANTREE()*/

void HUFFMANCODE(code1,tree1) /*根据哈夫曼树求出哈夫曼编码*/

codetype code1[]/*求出的哈夫曼编码所在*/

hufmtree tree1[]/*已知的哈夫曼树*/

{

int i,j,c,p

codetype cd/*缓冲变量*/

codetype *code

hufmtree *tree

code=code1

tree=tree1

for(i=0i<Ni++)

{

cd.start=N

c=i+1/*从叶节点出发向上回溯*/

p=tree[i].parent/*tree[p-1]是tree[i]的双亲*/

while(p!=0)

{

cd.start--

if(tree[p-1].lchild==c)

cd.bits[cd.start]='0'/*tree[i]是左子树。生成代码'0'*/

else

cd.bits[cd.start]='1'/*否则tree[i]是右子树。生成代码'1'*/

c=p

p=tree[p-1].parent

}

code[i]=cd/*第i+1个字符的编码存入code[i]*/

}

} /*HUFFMANCODE*/

#include "stdio.h"

main()

{

int k1,k2

hufmtree tree_fina[M]

hufmtree *p11=tree_fina

codetype code_fina[N]

codetype *p21=code_fina

HUFFMAN(p11)/*建立huffman树*/

HUFFMANCODE(p21,p11)/*haffman码*/

for(k1=0k1<Nk1++) /*输出编码*/

{

printf("number %d haffmancode: ",k1+1)

for(k2=code_fina[k1].startk2<Nk2++)

printf(" %c",code_fina[k1].bits[k2])

printf("\n")

}

}