题目:小波变换中的信号扩展(延拓)问题
本篇主要是做为上一篇《压缩感知稀疏基之离散小波变换》的一个补充说明。
首先给出一个卷积的例子:
从上面的卷积计算过程中可以看出,在计算y(0)和y(4)时,x(n)和h(n)只有一个点对应,在计算其它值时有两个点对应,以上计算还可以用矩阵表示如下:
我们可以对x(n)按某种规律进行扩展,以使求卷积过程中x(n)和h(n)一直有两个点(h的长度)对应,这就是信号的扩展。
观察可知,只要对x(n)左右各扩展一个点即可,在Matlab中有函数wextend对信号进行扩展,扩展的模式如下:
注意最后一种’per’模式,因为我们在生成N×N的小波变换矩阵时用的是此模式,所以重点阐述这种模式。
在Matlab分别运行两条命令,可得输出结果如下:
>> x=[1 2 34];wextend(1,'per',x,1)
ans =
4 1 2 3 4 1
>> x=[1 2 3];wextend(1,'per',x,1)
ans =
3 1 2 3 3 1
命令wextend(1,'per',x,1)中的输入参数中第一个“1”表示是一维扩展,最后一个“1”表示左右各扩展一个点。从上面的两个结果基本可知得到’per’模式的扩展规律:
1)对于长度为偶数的序列,直接按周期进行扩展;
2)对于长度为奇数的序列,先把序列延长一个点变为偶数后再按周期进行扩展。
在上面的例子中,若对信号按’per’模式进行扩展,则计算过程如下:观察可以发现由h构成的矩阵各行实际上是一个循环移位的结果。
我们可以在’per’扩展模式下写出一个较为复杂、但代表性更强的表达式,设x(n)长度为8,h(n)的长度为4,若对x(n)按’per’扩展模式扩展,则卷积表达式的矩阵形式为:
在Matlab中编程得到这个变换矩阵时,可以分成几个步骤:
1)参数初始化:N=length(x),L=length(h),在这里N=8,L=4
2)得到h=[h(0),h(1),h(2),h(3)]的反转序列,即h_1=[h(3),h(2),h(1),h(0)],这一操作可使用命令“h_1 = fliplr(h);”实现
3)由h_1得到一个长为N的基本行向量:p1_0 = [h_1zeros(1,N-L)];
这里得到的p1_0实际上即是上面变换矩阵的第4行
4)通过对p1_0循环移位得到变换矩阵中的各行:
Matlab中有循环移位函数circshift,但这个函数是对行之间循环移位,而这里的行向量p1_0是1行N列,为了实现循环移位,可以对其先进行转置变为列向量再进行循环移位,移位结束后再转置变回行行量;
若要得到变换矩阵中的第一行:circshift(x’,-(L-1)),如:
>> x=[4 3 2 10 0 0 0]
x =
4 3 2 1 0 0 0 0
>>circshift(x',-(4-1))'
ans =
1 0 0 0 0 4 3 2
同理可以得到其它各行。