资源简介
用简单的haar 小波对信号进行二层分解
代码片段和文件信息
/***********************
@author 张浩龙
@all rights reserved
采用haar小波对信号进行分析
分解层数:一层
目标信号:sin 函数
其他说明:若想多层分解 只需将coffe数组中的偶数项(对应于低频信号)再通过函数进行一次即可
若想采用其他小波 例如db2小波 则需要变换一下系数
比如db2 小波有四个系数 分别为 0.48296 0.83651 0.22414 -0.1294 可在matlab下用 wfilter(‘db2‘‘d‘)得到相应系数
************************/
#include
#include
#define M 100 //M为采样个数
//以下四个宏为高通和低通滤波器系数(滤波器分解系数) 也为haar小波方程和尺度方程的分解系数
#define H1_0 -0.7071
#define H1_1 0.7071
#define H0_0 0.7071
#define H0_1 0.7071
double signal[M];//原信号
double rec_signal[M];//重建的信号
double error[M];//误差数组
double coffe[M]; //系数矩阵 存储一次变换后 ca 和 cd
void input_Signal(void)
{
//暂且用正弦信号作为输入 当然可以改成昨天你给我看的那个调频信号 不过需要你自己在这构建函数表达式
for(int i = 0; i signal[i] = sin(i);
}
void Haar_transform(void)
{
for(int i=0; i {
if(0 == i%2)
{
coffe[i] = signal[i]*H0_1 + signal[i+1]*H0_0;//此处为进行卷积计算 低通滤波
}
else
{
coffe[i] = signal[i-1]*H1_1 + signal[i]*H1_0;//此处为进行卷积计算 高通滤波
}
}
}
void Haar_reconstruction(void)
{
for(int i=0; i {
if(0 == i%2)
{
rec_signal[i] = coffe[i]*H0_1 + coffe[i+1]*H1_1;//此处为进行卷积计算 低通滤波
}
else
{
rec_signal[i] = coffe[i-1]*H0_0 + coffe[i]*H1_0;//此处为进行卷积计算 高通滤波
}
}
}
void Error_Calculate(void)
{
for(int i=0; i error[i] = fabs(signal[i] - rec_signal[i]);
}
void output(void)
{
int i;
printf(“一层分解低频系数为:\n“);
for(i=0; i {
printf(“% lf“coffe[i]);
}
printf(“一层分解高频系数为:\n“);
for(i=1; i {
printf(“% lf“coffe[i]);
}
printf(“原信号为:\n“);
for(i=0; i {
printf(“% lf“signal[i]);
}
printf(“重建信号为:\n“);
for(i=0; i {
printf(“% lf“rec_signal[i]);
}
printf(“误差为:\n“);
for(i=0; i {
printf(“% lf“error[i]);
}
}
void main(void)
{
input_Signal();
Haar_transform();
Haar_reconstruction();
Error_Calculate();
output();
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 2333 2013-04-20 12:29 Simple_Haar_Wavelet\Haar_wavelet.txt
文件 2333 2013-04-20 12:28 Simple_Haar_Wavelet\Haar_wavelets.cpp
文件 211 2013-04-20 12:32 Simple_Haar_Wavelet\说明.txt
目录 0 2013-04-20 12:30 Simple_Haar_Wavelet\
评论
共有 条评论