C语言实现小波分解,提取近似与细节分量,包含详细例程
声明
本文的C语言实现小波分解非本人原创,均参考了网络上的文章(详见最后的参考资料),程序主要来自李承宇的文章和程序。
我只对程序进行了少量的修改,添加了大量注释,提高了程序的可阅读性。
数据均为自己的数据,可以免费提供大家测试学习。
程序
main.c
// WaveletAccumulation.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "Wavelet.h"
void main()
{
double data[LENGTH] = {
0 }; //输入信号
double temp[LENGTH] = {
0 }; //中间结果
double data_output[LENGTH] = {
0 }; //一维小波变换后的结果
double c[8][LENGTH] = {
0 }; //各层的近似(前半段)与细节(后半段)
double a[8][LENGTH] = {
0 }; //各层的近似系数,第i行表示第i层分解的近似 Approximate
double d[8][LENGTH] = {
0 }; //各层的细节系数,第i行表示第i层分解的细节 Detail
int sigLen = 0; //输入信号长度
int waveletBasisLen = 6; //Daubechies正交小波基长度
int nStep = 4; //分解层数
FILE *fp; //文件指针
char s[32]; //从txt文件中读取一行数据
/* matlab产生的 db3小波 */
double Lo_D[] = {
0.0352262918821007, -0.0854412738822415, -0.135011020010391, 0.459877502119331 , 0.806891509313339 , 0.332670552950957 };
double Hi_D[] = {
-0.332670552950957 , 0.806891509313339 , -0.459877502119331, -0.135011020010391, 0.0854412738822415, 0.0352262918821007 };
/* matlab产生的 db3小波 */
// double Lo_D[] = { 0.00333572528500155, -0.0125807519990155, -0.00624149021301171, 0.0775714938400652, -0.0322448695850295, -0.242294887066190 , 0.138428145901103 , 0.724308528438574 , 0.603829269797473 , 0.160102397974125 };
// double Hi_D[] = { -0.160102397974125 , 0.603829269797473 , -0.724308528438574 , 0.138428145901103 , 0.242294887066190 , -0.0322448695850295, -0.0775714938400652, -0.00624149021301171, 0.0125807519990155, 0.00333572528500155 };
//matlab计算系数函数:[Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db1');
waveletBasisLen = sizeof(Lo_D) / sizeof(double);
//从文件读取输入信号
if ((fp = fopen("F:\\Desktop\\data.txt", "r")) == NULL)
{
printf("can't open file!\n");
exit(0);
}
while (fgets(s, 32, fp) != NULL) //读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行
{
data[sigLen] = atof(s); //atof将字符串转换为数据
sigLen++;
}
//关闭文件
fclose(fp);
//一维小波变换
DWT1D(data