小波变换c语言实现
㈠ 我想用多贝西小波对有奇异点的信号进行分析,然后提取奇异点发生的时间点信息,用c语言怎么写
(1)小波模极大值重构 MATLAB代码_天天向上_新浪博客 http://blog.sina.com.cn/s/blog_6c00b0e30100u1s5.html
function
[signal,swa,swd,ddw,wpeak]=wave_peak(points,level,Lo_D,Hi_D,Lo_R,Hi_R,offset)
%
该函数用于读取ecg信号,找到小波变换模极大序列
warning off;
ecgdata=load('ecg.txt');
%需要分析的信号,自己加
plot(ecgdata(1:points)),grid on,axis
tight,axis([1,points,-50,300]);
signal=ecgdata(1:points)'+offset;
% 信号的小波变换,按级给出概貌和细节的波形
[swa,swd] =
swt(signal,level,Lo_D,Hi_D);
figure;
subplot(level,1,1);
plot(real(signal)); grid on;axis tight;
for i=1:level
subplot(level+1,2,2*(i)+1);
plot(swa(i,:)); axis
tight;grid on;xlabel('time');
ylabel(strcat('a
',num2str(i)));
subplot(level+1,2,2*(i)+2);
plot(swd(i,:)); axis
tight;grid on;
ylabel(strcat('d ',num2str(i)));
end
%求小波变换的模极大值及其位置
ddw=zeros(size(swd));
pddw=ddw;
nddw=ddw;
posw=swd.*(swd>0);
pdw=((posw(:,1:points-1)-posw(:,2:points))<0);
pddw(:,2:points-1)=((pdw(:,1:points-2)-pdw(:,2:points-1))>0);
negw=swd.*(swd<0);
ndw=((negw(:,1:points-1)-negw(:,2:points))>0);
nddw(:,2:points-1)=((ndw(:,1:points-2)-ndw(:,2:points-1))>0);
ddw=pddw|nddw;
ddw(:,1)=1;
ddw(:,points)=1;
wpeak=ddw.*swd;
wpeak(:,1)=wpeak(:,1)+1e-10;
wpeak(:,points)=wpeak(:,points)+1e-10;
%按级给出小波变换模极大的波形
figure;
for i=1:level
subplot(level,1,i);
plot(wpeak(i,:)); axis tight;grid
on;
ylabel(strcat('j= ',num2str(i)));
end
注:运行此程序时一定要将待处理信号添加进去,程序中的红色部分。
追问:
ecgdata=load('ecg.txt');
㈡ C语言怎么实现小波变换
#include<stdio.h>
#include<stdlib.h>
#defineLENGTH512//信号长度
/******************************************************************
*一维卷积函数
*
*说明:循环卷积,卷积结果的长度与输入信号的长度相同
*
*输入参数:data[],输入信号;core[],卷积核;cov[],卷积结果;
* n,输入信号长度;m,卷积核长度.
*
*李承宇,[email protected]
*
*2010-08-18
******************************************************************/
voidCovlution(doubledata[],doublecore[],doublecov[],intn,intm)
{
inti=0;
intj=0;
intk=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小波基紧支集长度.
*
*李承宇,[email protected]
*
*2010-08-19
******************************************************************/
voidDWT1D(doubleinput[],doubleoutput[],doubletemp[],doubleh[],
doubleg[],intn,intm)
{
// doubletemp[LENGTH]={0};//?????????????
inti=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];//小波系数
}
}
voidmain()
{
doubledata[LENGTH];//输入信号
doubletemp[LENGTH];//中间结果
doubledata_output[LENGTH];//一维小波变换后的结果
intn=0;//输入信号长度
intm=6;//Daubechies正交小波基长度
inti=0;
chars[32];//从txt文件中读取一行数据
staticdoubleh[]={.332670552950,.806891509311,.459877502118,-.135011020010,
-.085441273882,.035226291882};
staticdoubleg[]={.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);
}
㈢ 要对图像进行小波变换去噪,可以用哪些图像处理库(C/C++)
1.最简单的方法:
public static String reverse1(String str)
{
return new StringBuffer(str).reverse().toString();
}
2.最常用的方法:
public static String reverse3(String s)
{
char[] array = s.toCharArray();
String reverse = ""; //注意这是空串,不是null
for (int i = array.length - 1; i >= 0; i--)
reverse += array[i];
return reverse;
}
3.常用方法的变形:
public static String reverse2(String s)
{
int length = s.length();
String reverse = ""; //注意这是空串,不是null
for (int i = 0; i < length; i++)
reverse = s.charAt(i) + reverse;//在字符串前面连接, 而非常见的后面
return reverse;
}
4.C语言中常用的方法:
public static String reverse5(String orig)
{
char[] s = orig.toCharArray();
int n = s.length - 1;
int halfLength = n / 2;
for (int i = 0; i <= halfLength; i++) {
char temp = s[i];
s[i] = s[n - i];
s[n - i] = temp;
}
return new String(s); //知道 char数组和String相互转化
}
㈣ 小波包频带能量算法可以用c语言实现吗
小波变换已应用到工程的各个方面,但一般只是应用Madab的小波工具包来编程,有时需要自己编程实现.故这里给出了DB4小波变换的C实现
㈤ C语言实现把一个JPG图片分解为两个图片,急!!谢谢
麻烦。。无聊。。
先找着jpg文件头格式。。
C打开文件。。找到数据部分。。
新建文件。。写入。。保存。。
综上所述:无聊+麻烦。
㈥ 有关C语言运行小波变换程序的时间问题。
我只听闻小波技术,从未试过哈,只做过傅里叶变换而已。。。但是,你可以分析下你输出的数据,正确与否,就用matlab的输出和C执行器的输出对比下,就知道靠不靠谱了啊。
如果嫌数据太多,可以找一些对比分析软件,如果实在无法全部分析,就弄几个特殊点,让程序就在那一些点输出对应值,对比matlab和C执行器的输出,多次换点,再对比,就知道靠不靠谱了。。。。你只是通过运算时间,怎么知道靠不靠谱呢,呵呵,要是你用多核DSP来算,只是一瞬间的事情,岂不是更不靠谱了。
㈦ 怎么把小波变换分成低频和高频部分,单独进行处理,高人指教,在线等,所有积分送上。。。
没具体做过,不过按照你的意图,应该就是使用mallat算法的离散小波变换(DWT),在matlab中有现成的函数很易实现。
如果你非要用C,那么需要C下解决以下几点:
1.信号处理中卷积的C程序实现;
2.当实现了卷积计算的C代码,你需要得到某个小波函数对应的高频(带通)和低通分解和重构滤波器组,这可以在matlab的wfilters函数和帮助中得到详细的滤波器系数;
3.以上两个问题都解决了,那么直接对信号用滤波器进行卷积再去掉结果越一半的数据即可得到DWT的高频细节和低频逼近系数,用这些系数补零插值再卷积一次就得到了高频细节和低频逼近的重构信号(这就是你要的高频和低频的两个单独部分,然后你想咋处理就咋处理)。对于多层的DWT你只要对小波系数逐层减半即可实现DWT每层尺度伸长一倍的效果。
4.这时你会碰到卷积滤波的边缘效应,你需要对原始信号进行扩展,你可以参看matlab中dwtmode函数的帮助文档;
5.对于二维DWT,你还要实现张量积C代码的实现,还有二维离散采样(行抽取,列抽取和斜抽取)的C代码(在dwt2函数的帮助文档中有详细的流程图)。
由于matlab函数通常是用C语言编制的,而且每个函数都可查询原始代码,如果你有一定的水平,可以试试。不过你这问题需要较为深入的小波分析,信号处理和数学理论的支持,能不能编出象样的C程序就不知道。这问题matlab很容易就解决了,可非要用C,这就是一个比较大的工程了,一个人要花费好长时间还不一定编的成,光数学理论就伤不起啊,技术问题就更别提了!到现在为止也没见有啥象样的小波C程序,你搜搜试试吧。能想到的就这么多了,水平有限,仅供参考,Good luck!
㈧ 二维小波变换怎样用矩阵来实现
二维小波变换矩阵方法
YC,YS]=wavedec2(Y,2,'db1');
Y为要分解的图像矩阵,2为分解的层数,‘db1'为采用的小波基。回两个矩阵YC和YS。Yh2=detcoef2('h',YC,YS,2);这是提取出图像2层分解后的水平分量,h改v是垂直分量,h该d是对角分量。细节分量用另外一个方法提取。
㈨ 关于小波db2和db4在c语言中的实现
小波db2和db4在c语言程序中具体差别体现在阶数不同,也就是存储单元占用量不同,同时信号的延时不同,延时单元的长度也不同