学一下Gabor分解:
在信号处理中,使用非正交的基函数对信号进行分解的一种方法。而傅里叶分析例如DFT则是使用正交的基函数进行分解。
临界采样的Gabor分解,离散分解表示成:
x
~
(
n
)
=
∑
m
=
1
M
−
1
∑
k
=
0
K
−
1
a
~
m
k
g
~
m
k
(
n
)
a
~
m
k
=
∑
n
=
0
L
−
1
x
~
(
n
)
w
~
m
k
∗
(
n
)
g
~
m
k
(
n
)
=
g
~
(
n
−
m
K
)
∗
e
j
2
π
n
k
/
K
w
~
m
k
∗
(
n
)
=
w
~
(
n
−
m
K
)
∗
e
j
2
π
n
k
/
K
function [amk, w] = gabor_translater(x, g, M, K)
%gabor变换
% x:待分析的实数信号
% g:综合窗函数序列
% M:时域离散采样数
% K:频域离散采样数
% amk:gabor变换系数,复数矩阵
% w:分析窗函数
L = length(x);
G = zeros(L, L);
if L - M * K ~= 0 %不是临界Gabor变换
amk = [];
w = [];
else %是临界Gabor变换
% 计算分析窗函数序列
for mi = 0 : M - 1
for ki = 0 : K - 1
ind = (0 : L - 1) + mi * K;
tL = find(ind > L - 1);
if ~isempty(tL)
ind(tL) = ind(tL) - L;
end
ti = find(ind < 0);
if ~isempty(ti)
ind(ti) = ind(ti) + L;
end
G(mi * K * ki + 1, :) = conj(g(ind + 1)).*exp(1i * 2 * pi *ki * (0 : L-1) / K);
end
end
b = [1 zeros(1, L-1)]';
w = real(G \ b); %求分析窗函数
%计算Gabor系数
amk = zeros(L, L);
for mi = 0 : M -1
for ki = 1 : K
ind = (0 : L - 1) + mi * K;
tL = find(ind > L - 1);
if ~isempty(tL)
ind(tL) = ind(tL) - L;
end
ti = find(ind < 0); %防止数组越界
if ~isempty(ti)
ind(ti) = ind(ti) + L;
end
wmk = w(ind + 1, 1)'.*exp(1i * 2 * pi * ki * (0 : L-1) / K);%综合窗函数
amk(mi + 1, ki) = sum(x.*conj(wmk)); %Gabor变换分解系数
end
end
end
end
《医学信号分析与处理》