资源简介
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
- 上一篇:mfc 物业管理系统
- 下一篇:图书管理系统MFC+SQL+VC
相关资源
- 最大相关最小冗余的C语言源码
- CNN卷积神经网络实现语音识别.zip
- 使用c语言写的卷积运算程序
- 不相关随机无标度网络UCM的C语言实现
- 用fft求互相关,速度更快,c语言实现
- 维特比译码+卷积码编码程序C/C++实现
- 一些常见的数据结构ADT定义及相关数
- 支持多标签的convert_imageset.cpp代码
- ConvDBC_TO_Code.tar.gz
- 用C语言实现卷积计算并绘制出卷积计
- 自相关c语言代码简单实用
- hid.lib setupapi.lib 等HID开发相关的库和
- C++实现离散序列自相关与互相关
- 自相关与互相关的C++实现
- 卷积码的viterbi译码算法的c语言源代码
- 数据结构线性链表的相关操作(C语言
- 编码及转码(libiconv库)
- C++ 使用触发器删除相关联的两表间的
- MODBUS编程调试工具(附相关)
- LibreCAD相关源码
- Tesseract-OCR相关资料
- 21天学通 C++第8版.pdf以及相关源码
- mysql操作类,封装了c语言相关的api,
- 经典线积分卷积LIC算法
- 卷积神经网络lenet-5的c++实现
- c++图像卷积操作
- C++ 三种卷积方法实现
- c语言实现的离散卷积程序
- 信号序列卷积的VC实现
- 卷积码编译码C语言程序
评论
共有 条评论