小波变换Mallat算法c++计算实例

合集下载

小波分析实验:二维离散小波变换(Mallat快速算法)

小波分析实验:二维离散小波变换(Mallat快速算法)

小波分析实验:实验2二维离散小波变换(Mallat快速算法)实验目的:在理解离散小波变换原理和Mallat快速算法的基础上,通过编程对图像进行二维离散小波变换,从而加深对二维小波分解和重构的理性和感性认识,并能提高编程能力,为今后的学习和工作奠定基础。

实验工具:计算机,matlab6.5分解算法:重构算法: “"二工必(刃- 2上*[十三g (刃- 2k )d [ *分解算法写成矩阵的形式! (lb g 的长度为4)4[0]如]力⑵ h[3] 0 0 0 '[勺【0】• 记"h[0] h[\]h[2]山⑶ …• ••••・ • •C J=勺【1] • •申[2] h[3] 00 0-.^[0] ^[1]_.勺[乃-1】_>[0] g[l] g ⑵ g[3] 0 • • •e=• 0 •g[0] g[l]g ⑵ • • g[3]■ • •・■ 0• D J =<[i]■•目2] ■g[3]0 0…茎0] 畀]|g[0] g[l] g[2] g[3] 0 0 0 I0 0 g[0] g[l]g[2] S [3] - 0• ••••• • ••・•・・■ • • g[2] g[3] 0 00 ...g[0] g[l]J |_勺4-1[叨]I二・(2»于是Mallat分解公式为矩阵变换?丄Cj- = PC^................. ⑶卩D j = Q D J-L..... .......... ⑷重构算法写成矩阵变换:-C J_I =C$ + Dj------------------------------------ (5) 4M NPPq. 一片『峰值信噪比计算公式:P沁沁逻竺皿E卢H耿V 屈E M {皿,00分别表示原始图像和重建图像,且本实验采取的一些小技乐P (I)分SW法…编程时用如下思想:(h, g 的长度为4)“今[1]勺[刀-1]■ V■■丐⑼£[1] 4刀-1】将数据。

小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现)

小波学习之一(单层一维离散小波变换DWT的Mallat算法C++和MATLAB实现)

⼩波学习之⼀(单层⼀维离散⼩波变换DWT的Mallat算法C++和MATLAB实现)1 Mallat算法离散序列的Mallat算法分解公式如下:其中,H(n)、G(n)分别表⽰所选取的⼩波函数对应的低通和⾼通滤波器的抽头系数序列。

从Mallat算法的分解原理可知,分解后的序列就是原序列与滤波器序列的卷积再进⾏隔点抽取⽽来。

离散序列的Mallat算法重构公式如下:其中,h(n)、g(n)分别表⽰所选取的⼩波函数对应的低通和⾼通滤波器的抽头系数序列。

2 ⼩波变换实现过程(C/C++)2.1 ⼩波变换结果序列长度⼩波的Mallat算法分解后的序列长度由原序列长SoureLen和滤波器长FilterLen决定。

从Mallat算法的分解原理可知,分解后的序列就是原序列与滤波器序列的卷积再进⾏隔点抽取⽽来。

即分解抽取的结果长度为(SoureLen+FilterLen-1)/2。

2.2 获取滤波器组对于⼀些通⽤的⼩波函数,简单起见,可以通过Matlab的wfilters(‘wavename’)获取4个滤波器;特殊的⼩波函数需要⾃⾏构造获得。

下⾯以db1⼩波函数(Haar⼩波)为例,其变换与重构滤波器组的结果如下://matlab输⼊获取命令>> [Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db1')//获取的结果Lo_D =0.7071 0.7071Hi_D =-0.7071 0.7071Lo_R =0.7071 0.7071Hi_R =0.7071 -0.70712.3 信号边界延拓在Mallat算法中,假定输⼊序列是⽆限长的,⽽实际应⽤中输⼊的信号是有限的采样序列,这就会出现信号边界处理问题。

对于边界信号的延拓⼀般有3种⽅法,即零延拓、对称延拓和周期延拓。

3种延拓⽅法⽐较情况如下:对于正交⼩波变换来说,前两种延拓⽅法实现起来⽐较简单,但重建时会产⽣边界效应,⽽且分解的层数越多,产⽣的边界效应越显著。

一维小波变换的C++实现

一维小波变换的C++实现

⼀维⼩波变换的C++实现 将⼩波展开系数当成离散信号,尺度函数和⼩波函数的MRA⽅程系数看成数字滤波器组,根据Mallat快速算法的原理,⼩波变换对数据的处理⽅法可简化成对信号逐级采样和滤波的过程。

图1 ⼩波变换的滤波器实现(a)分解算法 (b)重构算法 ⼀层⼩波分解算法流程如图2所⽰,信号将先经过⼩波分解低通滤波器和⾼通滤波器,随后被降采样,实现数据重构。

⽽滤波算法可简化为待处理信号与滤波器数组卷积的过程,为了保证卷积前和卷积后数组的长度相同,结合⼩波变换中数组延拓的思想,在实际编程过程中,可以将超过信号长度的那段数据以前端对齐的⽅式与前⾯⼀段数据相加。

将卷积后的数组每2个点采样⼀次,即可获得⼩波分解后的尺度系数和⼩波系数。

图2 ⼀层⼩波分解算法(X:待分解数组;H,G:⼩波分解滤波器;C,D:⼩波重构后数组) ⼩波重构算法是⼩波分解算法的逆运算,其流程为升采样和滤波,最后数据相加实现重构。

⼩波重构算法中滤波可视为系数与⼩波重构滤波器的卷积,与⼩波正变换类似,在重构算法中,需要将卷积后的数组末位对齐相加,获得与原数组长度相同的卷积结果。

将⼩波系数和尺度系数以2为步长进⾏升采样,将获得的新数组分别经过⼩波重构低通滤波器和⾼通滤波器,再将滤波后的两组数据相加,即实现了⼀层⼩波重构。

1#define LENGTH 5122#define LEVEL 43#define L_core 645static void Covlution(double data[], double core[], double cov[], int LEN)6 {7double temp[LENGTH + L_core - 1] = {0};8int i = 0;9int j = 0;1011for(i = 0; i < LEN; i++)12 {13for(j = 0; j < L_core; j++)14 {15 temp[i + j] += data[i] * core[j];19for(i = 0; i < LEN; i++)20 {21if(i < L_core - 1)22 cov[i] = temp[i] + temp[LEN + i];23else24 cov[i] = temp[i];25 }2627 }2829static void Covlution2(double data[], double core[], double cov[], int LEN)30 {31double temp[LENGTH + L_core - 1] = {0};32int i = 0;33int j = 0;3435for(i = 0; i < LEN; i++)36 {37for(j = 0; j < L_core; j++)38 {39 temp[i + j] += data[i] * core[j];40 }41 }4243for(i = 0; i < LEN; i++)44 {45if(i < L_core - 1)46 cov[i + LEN - L_core + 1] = temp[i] + temp[LEN + i];47else48 cov[i - L_core + 1] = temp[i];49 }5051 }5253static void DWT1D(double input[], double output[], double LF[], double HF[], int l)54 {55int i = 0;56double temp[LENGTH] = {0};57int LEN = LENGTH / pow(2, l - 1);5859 Covlution(input, LF, temp, LEN);60for(i = 1; i < LEN; i += 2)61 {62 output[i/2] = temp[i];63 }6465 Covlution(input, HF, temp, LEN);66for(i = 1; i < LEN; i += 2)67 {68 output[LEN/2 + i/2] = temp[i];69 }70 }7172static void DWT(double input[], double output[], double LF[], double HF[], int len[])73 {74int i;75int j;7677 len[0] = len[1] = LENGTH / pow(2, LEVEL);78for(i = 2; i <= LEVEL; i++) len[i] = len[i - 1] * 2;7980 DWT1D(input, output, LF, HF, 1);81for(i = 2; i <= LEVEL; i++)82 {83for(j = 0; j < len[LEVEL + 2 - i]; j++) input[j] = output[j];84 DWT1D(input, output, LF, HF, i);85 }86 }8788static void IDWT1D(double input[], double output[], double LF[], double HF[], int l, int flag) 89 {90int i = 0;91double temp[LENGTH] = {0};92int LEN = l * 2;9394if(flag) Covlution2(input, HF, temp, LEN);95else Covlution2(input, LF, temp, LEN);9697for(i = 0; i < LEN; i++)98 {99 output[i] = temp[i];103static void IDWT(double input[], double output[], double LF[], double HF[], int len[], int level)104 {105int i;106int j;107for(j = 0; j < len[LEVEL + 1 - level]; j++)108 {109 output[2 * j] = 0;110 output[2 * j + 1] = input[j];111 }112for(j = 0; j < 2 * len[LEVEL + 1 - level]; j++)113 {114 input[j] = output[j];115 }116 IDWT1D(input, output, LF, HF, len[LEVEL + 1 - level], 1);117118for(i = level - 1; i > 0; i--)119 {120for(j = 0; j < len[LEVEL + 1 - i]; j++)121 {122 input[2 * j] = 0;123 input[2 * j + 1] = output[j];124 }125 IDWT1D(input, output, LF, HF, len[LEVEL + 1 - i], 0);126 }127 }⽤C++算法实现的⼩波变换结果与MATLAB实现的⼩波变换结果对⽐(⼼电信号,db5⼩波,5层分解)。

小波变换(内附奇异值分析matlab程序)

小波变换(内附奇异值分析matlab程序)

2、算法及其应用实例
小波在信号的奇异性检测中的应用举例 信号的突变点和奇异点等不规则部分通常包含重要信息,一般信号 的奇异性分为两种情况: (1)信号在某一时刻其幅值发生突变,引起信号的非连续,这种类 型的突变称为第一类型的间断点; (2)信号在外观上很光滑,幅值没有发生突变,但是信号的一阶微 分有突变发生且一阶微分不连续,这种类型的突变称为第二类型的间 断点。 应用小波分析可以检测出信号中的突变点的位置、类型以及变 化的幅度。
程序代码
load nearbrk; x=nearbrk; %使用db4对信号进行2层分解 [c,l]=wavedec(x,2,‘db4’); subplot(411); subplot(4,1,i+2); plot(x); plot(d); ylabel('x'); ylabel(['d',num2str(3-i)]); %对分解的第六层低频系数进行重构 end a=wrcoef('a',c,l,'db4',2); subplot(412); plot(a); ylabel('a2'); for i=1:2 %对分解的第2层到第1层的高频系数 进行重构 a=wrcoef('a',c,l,'db4',3-i);
3、小波分析的优缺点
小波变换与Fourier变换相比,是一个时间和频域的局域变换因而能 有效地从信号中提取信息,通过伸缩和平移等运算功能对函数或信号进 行多尺度细化分析(Multiscale Analysis),解决了Fourier变换不能 解决的许多困难问题。 小波变换存在以下几个优点: 小波变换存在以下几个优点: (1)小波分解可以覆盖整个频域(提供了一个数学上完备的描述) (2)小波变换通过选取合适的滤波器,可以极大的减小或去除所提取得不 同特征之间的相关性 (3)小波变换具有“变焦”特性,在低频段可用高频率分辨率和低时间分 辨率(宽分析窗口),在高频段,可用低频率分辨率和高时间分辨率(窄分 析窗口) 。 (4)小波变换实现上有快速算法(Mallat小波分解算法)。

(整理)小波变换课件第4章小波变换的实现技术.

(整理)小波变换课件第4章小波变换的实现技术.

第4章 小波变换的实现技术4.1 Mallat 算法双正交小波变换的Mallat 算法:设{}n h h =、{}n g g =、{}n h h =、{}n g g =为实系数双正交小波滤波器。

h ,g 是小波分析滤波器,h ,g 是小波综合滤波器。

h 表示h 的逆序,即n n h h -=。

若输入信号为n a ,它的低频部分和高频部分以此为1n a -和1n d -,小波分解与重构的卷积算法:11()()n n n na D a h d D a g --⎧⎪=*⎨=*⎪⎩ n11()()n n a Uah Ud g --=*+*先进行输入信号和分析滤波器的巻积,再隔点采样,以形成低频和高频信号。

对于有限的数据量,经过多次小波变化后数据量大减,因此需对输入数据进行处理。

4.1.1 边界延拓方法下面给出几种经验方法。

1. 补零延拓是假定边界以外的信号全部为零,这种延拓方式的缺点是,如果输入信号在边界点的值与零相差很大,则零延拓意味着在边界处加入了高频成分,造成很大误差。

实际应用中很少采用。

0121,0,,,,...,,0,0,......n s s s s -2.简单周期延拓将信号看作一个周期信号,即k n k s s +=。

简单周期延拓后的信号变为这种延拓方式的不足之处在于,当信号两端边界值相差很大时,延拓后的信号将存在周期性的突变,也就是说简单周期延拓可在边界引入大量高频成分,从而产生较大误差。

3. 周期对称延拓这种方法是将原信号在边界上作对称折叠,一般分二1)当与之做卷积的滤波器为奇数时,周期延拓信号为2)当与之做卷积的滤波器为偶数时,周期延拓信号为4. 光滑常数延拓在原信号两端添加与端点数据相同的常数。

0121,,,...,,n s s s s -0121,,,...,,n s s s s -0121,,,...,,n s s s s -0,...s 1,...,n s -01221,,,...,,,n n s s s s s --0121,,,...,,n s s s s -21012,...,,,,,...n s s s s s -321212,,,...,,,,...n n n s s s s s s ---10012,,...,,,,...n n s s s s s --10112,,,...,,,n n n s s s s s ---5. 平滑延拓在原信号两端用线性外插法补充采样值,即沿着信号两端包络线的一阶导数方向增加采样值。

小波变换C语言实现代码

小波变换C语言实现代码

#include <stdio.h> #include<math.h>#define height 256#define width 256void twoDDWT(double org[][width], double dwt[][width],int NumofBand); void oneDDWT(int flag, double org[][width], double dwt[][width]);void twoDIDWT(double dwt[][width], double rec[][width],int NumofBand); void oneDIDWT(int flag, double dwt[][width], double rec[][width]);int main()(int i, j;double org[height][width], dwt[height][width],rec[height][width];FILE *lena;FILE *lena3;FILE *lena4;lena = fopen("c:\\lena.raw", "rb");lena3 = fopen("c:\\lena3.raw", "wb");lena4 = fopen("c:\\lena4.raw", "wb");for (i = 0; i < height; i++) (for (j = 0; j < width; j++)( org[i][j] = fgetc(lena);))twoDDWT(org, dwt,4);for (i = 0; i < height/2; i++) (for (j = 0; j < width/2; j++)(org[i][j]=dwt[i][j];))twoDDWT(org, dwt,7);for (i = 0; i < height; i++) (for (j = 0; j < width; j++)( fputc(dwt[i][j], lena3);))twoDIDWT(dwt, rec,7);for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)( dwt[i][j]=rec[i][j];))twoDIDWT(dwt, rec,4);for (i = 0; i < height; i++)(for (j = 0; j < width; j++)( fputc(rec[i][j], lena4);))return 0;)void twoDDWT(double org[][width], double dwt[][width],int NumofBand)(if (NumofBand==4)(oneDDWT(0, org, dwt);oneDDWT(1, org, dwt);)if (NumofBand==7)(oneDDWT(2, org, dwt);oneDDWT(3, org, dwt);))void oneDDWT(int flag, double org[][width], double dwt[][width])(int i, j;double temp[height][width], temp1[height][width];double f_LPF[] = { -0.125, 0.25, 0.75, 0.25, -0.125 };double f_HPF[] = { -0.5, 1, -0.5 };if (flag == 0)//vertical direction{for (i = 0; i < height; i++){for (j = 0; j < width; j++){if (j == 0)temp[i][j] = f_LPF[0] * org[i][j + 2] + f_LPF[1] * org[i][j + 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == 1)temp[i][j] = f_LPF[0] * org[i][j] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];e se if (j > 1 && j < height-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == height-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j];else if (j == height-1)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3]* org[i][j - 1] + f_LPF[4] * org[i][j - 2];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(dwt[i][j] = temp[i][j * 2 + 1];))for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(if (j == 0)temp[i][j] = f_HPF[0] * org[i][j + 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j > 0 && j < height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j == height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j - 1];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(dwt[i][j + width/2] = temp[i][j * 2];)))if (flag == 1)//horizontal direction(for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < width-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == width-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == width-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];)for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(temp1[i][j] = temp[i * 2 + 1][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < width-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == width-1)temp[i][j] = f_HPF[0] *dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(temp1[i][j+width/2] = temp[i * 2][j];))for (i = 0; i < height; i++)(for (j = width/2; j < width; j++)(if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3]* dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];))for (i = 0; i < height; i++)(for (j = width/2; j < width; j++)(temp1[i+height/2][j-width/2] = temp[i * 2 + 1][j];for (i = 0; i < height; i++)(for (j = width/2; j < width; j++)(if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < height-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == height-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];))for (i = 0; i < height; i++)(for (j = width/2; j < width; j++)( temp1[i +height/2][j] = temp[i * 2][j];))for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(dwt[i][j] = temp1[i][j];)))if (flag == 2)//vertical direction(for (i = 0; i < height/2; i++)(for (j = 0; j < width; j++)(if (j == 0)temp[i][j] = f_LPF[0] * org[i][j + 2] + f_LPF[1] * org[i][j + 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == 1)temp[i][j] = f_LPF[0] * org[i][j] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3] * org[i][j + 1] + f_LPF[4] * org[i][j + 2];e se if (j > 1 && j < height/2-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3]*org[i][j + 1] + f_LPF[4] * org[i][j + 2];else if (j == height/2-2)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3]*org[i][j + 1] + f_LPF[4] * org[i][j];else if (j == height/2-1)temp[i][j] = f_LPF[0] * org[i][j - 2] + f_LPF[1] * org[i][j - 1] + f_LPF[2] * org[i][j] + f_LPF[3]*org[i][j - 1] + f_LPF[4] * org[i][j - 2];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(dwt[i][j] = temp[i][j * 2 + 1];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)(if (j == 0)temp[i][j] = f_HPF[0] * org[i][j + 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j > 0 && j < height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j + 1];else if (j == height-1)temp[i][j] = f_HPF[0] * org[i][j - 1] + f_HPF[1] * org[i][j] + f_HPF[2] * org[i][j - 1];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(dwt[i][j + width/4] = temp[i][j * 2];)))if (flag == 3)//horizontal direction(for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height/2-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3]* dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];))for (i = 0; i < height/4; i++)(for (j = 0; j < width/4; j++)(temp1[i][j] = temp[i * 2 + 1][j];))for (j = 0; j < width/4; j++)(if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < height/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == height/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];))for (i = 0; i < height/4; i++)(for (j = 0; j < width/4; j++)( temp1[i + height/4][j] = temp[i * 2][j];))for (i = 0; i < height/2; i++)(for (j = width/4; j < width/2; j++)(if (i == 0)temp[i][j] = f_LPF[0] * dwt[i + 2][j] + f_LPF[1] * dwt[i + 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == 1)temp[i][j] = f_LPF[0] * dwt[i][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i > 1 && i < height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i + 2][j];else if (i == height/2-2)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i + 1][j] + f_LPF[4] * dwt[i][j];else if (i == height/2-1)temp[i][j] = f_LPF[0] * dwt[i - 2][j] + f_LPF[1] * dwt[i - 1][j] + f_LPF[2] * dwt[i][j] + f_LPF[3] * dwt[i - 1][j] + f_LPF[4] * dwt[i - 2][j];))for (i = 0; i < height/4; i++)(for (j = width/4; j < width/2; j++)( temp1[i][j] = temp[i * 2 + 1][j];))for (i = 0; i < height/2; i++)(for (j = width/4; j < width/2; j++)(if (i == 0)temp[i][j] = f_HPF[0] * dwt[i + 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i > 0 && i < width/2-1)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i + 1][j];else if (i == width/2)temp[i][j] = f_HPF[0] * dwt[i - 1][j] + f_HPF[1] * dwt[i][j] + f_HPF[2] * dwt[i - 1][j];)for (i = 0; i < height/4; i++)(for (j = width/4; j < width/2; j++)(temp1[i + height/4][j] = temp[i * 2][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)(dwt[i][j] = temp1[i][j];))))void twoDIDWT(double dwt[][width], double rec[][width],int NumofBand) ( if (NumofBand==7)(oneDIDWT(2, dwt, rec);oneDIDWT(3, dwt, rec);)if (NumofBand==4)(oneDIDWT(1, dwt, rec);oneDIDWT(0, dwt, rec);))void oneDIDWT(int flag, double dwt[][width], double rec[][width])(int i, j;double temp[height][width], temp1[height][width];double i_LPF[] = { 0.5, 1,0.5 };double i_HPF[] = { -0.125, -0.25, 0.75, -0.25, -0.125 };if (flag == 2)//horizontal direction{for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++){if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;}}for (i = 0; i < height/2; i++){for (j = 0; j < width/4; j++) {if (i == 0)rec[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height/2-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height/2-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];))for (i = height/4; i < height/2; i++)(for (j = 0; j < width/4; j++)(dwt[i - height/4][j] = dwt[i][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i == 0)temp1[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)temp1[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height/2-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height/2-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height/2-1)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(rec[i][j] = rec[i][j] + temp1[i][j];))for (j = width/4; j < width/2; j++)(dwt[i][j - height/4] = dwt[i][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i == 0)temp1[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height/2-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height/2-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];))for (i = height/4; i < height/2; i++)(for (j = width/4; j < width/2; j++)(dwt[i - height/4][j - width/4] = dwt[i][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(if (i == 0)dwt[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)dwt[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height/2-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height/2-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] *temp[i][j];else if (i == height/2-1)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];))for (i = 0; i < height/2; i++)(for (j = 0; j < width/4; j++)(rec[i][j + width/4] = temp1[i][j] + dwt[i][j];)))if (flag == 3)//vertical direction(for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)(if (j % 2 == 1)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;))for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)(if (j == 0)temp1[i][j] = i_LPF[0] * temp[i][j + 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j > 0 && j < height/2-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j == height/2-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j - 1];))for (i = 0; i < height/2; i++)(for (j = width/4; j < width/2; j++)(rec[i][j - width/4] = rec[i][j];))for (j = 0; j < width/2; j++)(if (j % 2 == 0)temp[i][j] = re可叩/2];elsetemp[i][j] = 0;))for (i = 0; i < height/2; i++)(for (j = 0; j < width/2; j++)(if (j == 0)rec[i][j] = i_HPF[0] * temp[i][j + 2] + i_HPF[1] * temp[i][j + 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == 1)rec[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[而+ 2];else if (j > 1 && j < height/2-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == height/2-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j];else if (j == height/2-1)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j - 1] + i_HPF[4] * temp[i][j - 2];))for (i = 0; i <height/2; i++)(for (j = 0; j < width/2; j++)(rec[i][j] = rec[i][j] + temp1[i][j];)))if (flag == 1)//horizontal direction(for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)rec[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i > 0 && i < height-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height-1)rec[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j];))for (i = 0; i < height/2; i++)(for (j = width/2; j < width; j++)(dwt[i][j - height/2] = dwt[i][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)temp1[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)temp1[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height-2)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i][j];else if (i == height-1)temp1[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(rec[i][j] = rec[i][j] + temp1[i][j];for (i = height/2; i <height; i++)(for (j = 0; j < width/2; j++)(dwt[i - width/2][j] = dwt[i][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i % 2 == 1)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)temp1[i][j] = i_LPF[0] * temp[i + 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j]; else if (i > 0 && i < height-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i + 1][j];else if (i == height-1)temp1[i][j] = i_LPF[0] * temp[i - 1][j] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i - 1][j]; ))for (i = height/2; i < height; i++)(for (j = width/2; j < width; j++)(dwt[i - height/2][j - width/2] = dwt[i][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i % 2 == 0)temp[i][j] = dwt[i / 2][j];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(if (i == 0)dwt[i][j] = i_HPF[0] * temp[i + 2][j] + i_HPF[1] * temp[i + 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == 1)dwt[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i > 1 && i < height-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] * temp[i + 2][j];else if (i == height-2)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i + 1][j] + i_HPF[4] *temp[i][j];else if (i == height-1)dwt[i][j] = i_HPF[0] * temp[i - 2][j] + i_HPF[1] * temp[i - 1][j] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i - 1][j] + i_HPF[4] * temp[i - 2][j];))for (i = 0; i < height; i++)(for (j = 0; j < width/2; j++)(rec[i][j + width/2] = temp1[i][j] + dwt[i][j];)))if (flag == 0)//vertical direction(for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(if (j % 2 == 1)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(if (j == 0)temp1[i][j] = i_LPF[0] * temp[i][j + 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j > 0 && j < height-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j + 1];else if (j == height-1)temp1[i][j] = i_LPF[0] * temp[i][j - 1] + i_LPF[1] * temp[i][j] + i_LPF[2] * temp[i][j - 1];))for (i = 0; i < height; i++)(for (j = width/2; j < width; j++)(rec[i][j - width/2] = rec[i][j];for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(if (j % 2 == 0)temp[i][j] = rec[i][j / 2];elsetemp[i][j] = 0;))for (i = 0; i < height; i++)(for (j = 0; j < width; j++)(if (j == 0)rec[i][j] = i_HPF[0] * temp[i][j + 2] + i_HPF[1] * temp[i][j + 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == 1)rec[i][j] = i_HPF[0] * temp[i][j] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[而+ 2];else if (j > 1 && j < height-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j + 2];else if (j == height-2)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j + 1] + i_HPF[4] * temp[i][j];else if (j == height-1)rec[i][j] = i_HPF[0] * temp[i][j - 2] + i_HPF[1] * temp[i][j - 1] + i_HPF[2] * temp[i][j] + i_HPF[3] * temp[i][j - 1] + i_HPF[4] * temp[i][j - 2];))for (i = 0; i <height; i++)(for (j = 0; j < width; j++)(rec[i][j] = rec[i][j] + temp1[i][j];。

小波变换课件ch4 Mallat算法及二维小波47页PPT

小波变换课件ch4 Mallat算法及二维小波47页PPT
5、教导儿童服从真理、服从集体,养 成儿童 自觉的 纪律性 ,这是 儿童道 德教育 最重要 的部分 。—— 陈鹤琴
Hale Waihona Puke 46、我们若已接受最坏的,就再没有什么损失。——卡耐基 47、书到用时方恨少、事非经过不知难。——陆游 48、书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。——史美尔斯 49、熟读唐诗三百首,不会作诗也会吟。——孙洙 50、谁和我一样用功,谁就会和我一样成功。——莫扎特
小波变换课件ch4 Mallat算法及二维 小波
1、纪律是管理关系的形式。——阿法 纳西耶 夫 2、改革如果不讲纪律,就难以成功。
3、道德行为训练,不是通过语言影响 ,而是 让儿童 练习良 好道德 行为, 克服懒 惰、轻 率、不 守纪律 、颓废 等不良 行为。 4、学校没有纪律便如磨房里没有水。 ——夸 美纽斯

小波变换快速算法及应用小结

小波变换快速算法及应用小结

离散小波变换的快速算法Mallat算法[经典算法]在小波理论中,多分辨率分析是一个重要的组成部分。

多分辨率分析是一种对信号的空间分解方法,分解的最终目的是力求构造一个在频率上高度逼近L2(R)空间的正交小波基,这些频率分辨率不同的正交小波基相当于带宽各异的带通滤波器。

因此,对于一个能量有限信号,可以通过多分辨率分析的方法把其中的逼近信号和细节信号分离开,然后再根据需要逐一研究。

多分辨率分析的概念是在构造正交小波基的时候提出的,并同时给出了著名的Mallat算法。

Mallat算法在小波分析中的地位相当于快速傅立叶变换在经典傅立叶变换中的地位,为小波分析的应用和发展起到了极大的推动作用。

MALLAT算法的原理在对信号进行分解时,该算法采用二分树结构对原始输入信号x(n)进行滤波和二抽取,得到第一级的离散平滑逼近和离散细节逼近,再采用同样的结构对进行滤波和二抽取得到第二级的离散平滑逼近和离散细节逼近,再依次进行下去从而得到各级的离散细节逼近对,…,即各级的小波系数。

重构信号时,只要将分解算法中的步骤反过来进行即可,但要注意,此时的滤波器与分解算法中的滤波器不一定是同一滤波器,并且要将二抽取装置换成二插入装置才行。

多孔算法[小波变换快速算法及其硬件实现的研究毛建华]多孔算法是由于1992年提出的一种利用Mallat算法结构计算小波变换的快速算法,因在低通滤波器和高通滤波器中插入适当数目的零点而得名。

它适用于的二分树结构,与Mallat算法的电路实现结构相似。

先将Mallat算法的电路实现的基本支路作一下变形。

令的z变换为与,下两条支路完全等价,只不过是将插值和二抽取的顺序调换一下罢了。

图中其它的上下两条支路也为等效支路,可仿照上面的方法证明。

这样,我们便可由Mallat算法的二分树电路结构得出多孔算法的电路级联图,原Mallat算法中的电路支路由相应的等效支路所取代,所以整个电路形式与Mallat算法非常相似。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档