博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小波变换C代码
阅读量:4672 次
发布时间:2019-06-09

本文共 3526 字,大约阅读时间需要 11 分钟。

#include 
#include
#define LENGTH 512//信号长度/******************************************************************* 一维卷积函数** 说明: 循环卷积,卷积结果的长度与输入信号的长度相同** 输入参数: data[],输入信号; core[],卷积核; cov[],卷积结果;* n,输入信号长度; m,卷积核长度.** 李承宇, lichengyu2345@126.com** 2010-08-18 ******************************************************************/void Covlution(double data[], double core[], double cov[], int n, int m){ int i = 0; int j = 0; int k = 0; //将cov[]清零 for(i = 0; i < n; i++) { cov[i] = 0; } //前m/2+1行 i = 0; for(j = 0; j < m/2; j++, i++) { for(k = m/2-j; k < m; k++ ) { cov[i] += data[k-(m/2-j)] * core[k];//k针对core[k] } for(k = n-m/2+j; k < n; k++ ) { cov[i] += data[k] * core[k-(n-m/2+j)];//k针对data[k] } } //中间的n-m行 for( i = m/2; i <= (n-m)+m/2; i++) { for( j = 0; j < m; j++) { cov[i] += data[i-m/2+j] * core[j]; } } //最后m/2-1行 i = (n - m) + m/2 + 1; for(j = 1; j < m/2; j++, i++) { for(k = 0; k < j; k++) { cov[i] += data[k] * core[m-j-k];//k针对data[k] } for(k = 0; k < m-j; k++) { cov[i] += core[k] * data[n-(m-j)+k];//k针对core[k] } }}/******************************************************************* 一维小波变换函数** 说明: 一维小波变换,只变换一次** 输入参数: input[],输入信号; output[],小波变换结果,包括尺度系数和* 小波系数两部分; temp[],存放中间结果;h[],Daubechies小波基低通滤波器系数;* g[],Daubechies小波基高通滤波器系数;n,输入信号长度; m,Daubechies小波基紧支集长度.** 李承宇, lichengyu2345@126.com** 2010-08-19 ******************************************************************/void DWT1D(double input[], double output[], double temp[], double h[], double g[], int n, int m){// double temp[LENGTH] = {0};//????????????? int i = 0;/* //尺度系数和小波系数放在一起 Covlution(input, h, temp, n, m); for(i = 0; i < n; i += 2) { output[i] = temp[i]; } Covlution(input, g, temp, n, m); for(i = 1; i < n; i += 2) { output[i] = temp[i]; }*/ //尺度系数和小波系数分开 Covlution(input, h, temp, n, m); for(i = 0; i < n; i += 2) { output[i/2] = temp[i];//尺度系数 } Covlution(input, g, temp, n, m); for(i = 1; i < n; i += 2) { output[n/2+i/2] = temp[i];//小波系数 }}void main(){ double data[LENGTH];//输入信号 double temp[LENGTH];//中间结果 double data_output[LENGTH];//一维小波变换后的结果 int n = 0;//输入信号长度 int m = 6;//Daubechies正交小波基长度 int i = 0; char s[32];//从txt文件中读取一行数据 static double h[] = {.332670552950, .806891509311, .459877502118, -.135011020010, -.085441273882, .035226291882}; static double g[] = {.035226291882, .085441273882, -.135011020010, -.459877502118, .806891509311, -.332670552950}; //读取输入信号 FILE *fp; fp=fopen("data.txt","r"); if(fp==NULL) //如果读取失败 { printf("错误!找不到要读取的文件/"data.txt/"/n"); exit(1);//中止程序 } while( fgets(s, 32, fp) != NULL )//读取长度n要设置得长一点,要保证读到回车符,这样指针才会定位到下一行?回车符返回的是零值?是,非数字字符经过atoi变换都应该返回零值 { // fscanf(fp,"%d", &data[count]);//一定要有"&"啊!!!最后读了个回车符!适应能力不如atoi啊 data[n] = atof(s); n++; } //一维小波变换 DWT1D(data, data_output, temp, h, g, n, m); //一维小波变换后的结果写入txt文件 fp=fopen("data_output.txt","w"); //打印一维小波变换后的结果 for(i = 0; i < n; i++) { printf("%f/n", data_output[i]); fprintf(fp,"%f/n", data_output[i]); } //关闭文件 fclose(fp);}

 

转载于:https://www.cnblogs.com/hjj-fighting/p/11106862.html

你可能感兴趣的文章
andorid之帧布局FrameLayout
查看>>
(转,记录用)jQuery页面加载初始化的3种方法
查看>>
C++常量的引用 const
查看>>
51nod 1101 换零钱 【完全背包变形/无限件可取】
查看>>
python单例设计模式(待补充)
查看>>
Binary Tree Inorder Traversal
查看>>
HDU 1394 Minimum Inversion Number (数据结构-线段树)
查看>>
ansible-playbook && Roles && include
查看>>
[Alpha阶段]第二次Scrum Meeting
查看>>
关于Java 8 forEach
查看>>
.NET设计模式(1):1.1 单例模式(Singleton Pattern)
查看>>
创建模态对话框和非模态对话框
查看>>
08-图8 How Long Does It Take
查看>>
二维数组中最大连通子数组
查看>>
java 正则表达式-忽略大小写与多行匹配
查看>>
mac 上亚马逊密钥登录
查看>>
css选择器中:first-child与:first-of-type的区别
查看>>
nopcommerce 二次开发
查看>>
NHibernate入门实例
查看>>
IBM_DS5020磁盘阵列做raid、热备并把盘阵挂在服务器上的步骤
查看>>