• 大小: 2KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: C/C++
  • 标签: 卷积  相关  conv  corr  

资源简介

C语言的卷积/相关程序代码,本人图像处理工程中使用的代码,正确可靠!

资源截图

代码片段和文件信息

/**************************************************************************
 *  文件名:CONV&CORR.cpp
 *
 *  函数:
 *
 *  CONV() - 快速卷积
 *  CORR() - 快速相关
 *  CONV2() - 图像快速卷积
 *  CORR2() - 图像快速相关
 *
 *************************************************************************/

#include “stdafx.h“
#include “CONV&CORR.h“
#include “FFT&IFFT.h“

#include 
#include 
using namespace std;

// 常数π
#define PI 3.1415926535

/*************************************************************************
 *
 * 函数名称:
 *   CONV()
 *
 * 参数:
 *   complex * TD1     - 指向时域序列数组1的指针
 *   complex * TD2     - 指向时域序列数组2的指针
 *   complex * TDout - 指向时域结果数组的指针
 *   M     - 序列1的长度
 *   N                          - 序列2的长度
 *
 * 说明:
 *   该函数利用FFT实现快速卷积。
 *
 ************************************************************************/
void CONV(complex * TD1 complex * TD2 complex * TDout int M int N)
{
// 卷积结果长度
int count = M+N-1;

// 便于使用FFT,把count扩展为2的幂
int Lcount;
    int r=0;  // 2的幂数,即FFT迭代次数,2的r次方=Lcount

int temp;
if (log(count)/log(2)-int(log(count)/log(2))==0)
      temp = log(count)/log(2);
else
  temp = log(count)/log(2)+1;
r = temp;
Lcount = 1<
// 分配运算所需存储器
    complex *X1 *X2 *FD1 *FD2 *FD12 *TD12;

X1 = new complex[Lcount];  //补齐后的序列1
X2 = new complex[Lcount];  //补齐后的序列2
FD1 = new complex[Lcount];   //序列1的傅立叶变换结果
FD2 = new complex[Lcount];   //序列2的傅立叶变换结果
FD12 = new complex[Lcount];   //序列12的频域相乘结果
TD12 = new complex[Lcount];   //序列12的傅立叶反变换结果

    //将序列补齐为Lcount长度
complex *X *Y;
X = new complex[M];  //临时存储器
Y = new complex[N];

// 将时域点写入XY
memcpy(X TD1 sizeof(complex) * M);
memcpy(Y TD2 sizeof(complex) * N);

// 循环变量
int i;

    for (i=0; i    {
        X1[i] = complex(X[i].real() X[i].imag());                                             
    }

    for (i=M; i    {
        X1[i] = complex(0 0);
    }

for (i=0; i    {
        X2[i] = complex(Y[i].real() Y[i].imag());
    }

    for (i=N; i    {
        X2[i] = complex(0 0);
    }

    // 释放内存
delete X;
delete Y;

    //序列1的FFT
FFT(X1 FD1 r);

//序列2的FFT
    FFT(X2 FD2 r);

    //序列12的频域相乘
    for (i=0; i    {
        FD12[i] = complex(FD1[i].real()*FD2[i].real()-FD1[i].imag()*FD2[i].imag() FD1[i].real()*FD2[i].imag()+FD1[i].imag()*FD2[i].real());
    }

//序列12的频域相乘的IFFT
    IFFT(FD12 TD12 r);

//TD12中的前M+N-1项为真正卷积结果写入TDout
    memcpy(TDout TD12 sizeof(complex)*count);

// 释放内存
delete X1;
delete X2;
delete FD1;
delete FD2;
delete FD12;
    delete TD12;
}

/***********************

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      14465  2006-09-26 10:25  CONV&CORR\CONV&CORR.cpp

     文件        501  2006-09-15 10:51  CONV&CORR\CONV&CORR.h

     目录          0  2013-03-23 23:36  CONV&CORR

----------- ---------  ---------- -----  ----

                14966                    3


评论

共有 条评论