匹配追踪原子的 MATLAB Wigner 图
MATLAB Wigner plot for Matching Pursuit atoms
我使用 MATLAB 应用匹配追踪来近似信号。我的问题是我很难想象所选原子的时频表示。我正在尝试生成类似于下图的维格纳图 (source)。
我查看了 Wavelet Toolbox、Signal Processing Toolbox 以及开源的 Time-Frequency Toolbox,但我可能只是使用了错误的参数,因为我在信号处理方面的经验非常有限。
例子
使用this data我的目标是重现上面的情节。
% fit the signal using MP
itermax = 50;
signal = load('signal.txt');
dict = wmpdictionary(length(signal));
[signal_fit, r, coeff, iopt, qual, X] = wmpalg('OMP', signal, dict, ...
'itermax', itermax);
% wigner plot of the simulated signal
tfrwv(signal_fit) % wigner-ville function from time-frequency toolbox
% wigner plot of each atom
atoms = full(dict(:, iopt)) % selected atoms
for i = 1:itermax
tfrwv(atoms(:, i))
end
不幸的是,none 结果图接近目标可视化。请注意,在示例中,我将 tfrwv
与标准参数一起使用,我使用它打开的 GUI 对其进行了调整。
非常感谢你的帮助。
更新
我想我现在已经明白需要使用 Gabor 原子来获得形状类似于拉伸高斯的斑点。不幸的是,信号处理工具箱的预定义指令中没有 Gabor 函数。然而,this question 帮助我实现了所需的字典,这样我得到的原子看起来与示例非常相似:
由于我的情节接近但不完美,还有两个问题悬而未决:
- 我们在第一个示例中看到的所有斑点是否可以单独由 Gabor 原子建模,或者我是否需要另一个函数字典?
- 如何将单独的 imagesc 图组合成一个可视化?
问。如何将单独的 imagesc 图组合成一个可视化?
一个。使用 subplot 绘制多个图,在图中找到下面带有 2 x 2 图的示例。在代码中更改方程式
x = linspace(-5,5);
y1 = sin(x);
subplot(2,2,1)
plot(x,y1)
title('First subplot')
y2 = sin(2*x);
subplot(2,2,2)
plot(x,y2)
title('Second subplot')
y3 = sin(4*x);
subplot(2,2,3)
plot(x,y3)
title('Third subplot')
y4 = sin(6*x);
subplot(2,2,4)
plot(x,y4)
title('Fourth subplot')
回答你的第二个问题'How can I combine the indidividual imagesc plots into a single visualization?'
如果您想使用 imagesc
叠加和显示多个二维矩阵,我建议您取元素方面的最大值。
例如,我生成了两个具有不同均值和方差的高斯分布的 31x31 网格。
function F = generate2dGauss(mu, Sigma)
x1 = -3:.2:3; x2 = -3:.2:3;
[X1,X2] = meshgrid(x1,x2);
F = mvnpdf([X1(:) X2(:)],mu,Sigma);
F = reshape(F,length(x2),length(x1));
end
F1 = generate2dGauss([1 1], [.25 .3; .3 1]);
F2 = generate2dGauss([-1 -1], [.1 .1; .1 1]);
我可以像你的例子一样用子图绘制它们,
figure;
subplot(1,2,1);
title('Atom 1');
imagesc(F1);
subplot(1,2,2);
title('Atom 2');
imagesc(F2);
或者我可以绘制两个网格的每个元素最大值。
figure;
title('Both Atoms');
imagesc(max(F1, F2));
您也可以尝试逐元素均值、总和等,但根据您给出的示例,我认为最大值会给您最干净的结果。
不同功能可能的优缺点:
- 如果您的原子始终具有零值背景且没有负值,则最大值最有效。如果背景为零值,但原子也包含负值,则负值可能会被其他原子的背景所掩盖。如果您的原子重叠,则较高的值当然会占主导地位。
- 平均会让你的峰不那么高,但在原子之间有重叠的地方可能更直观。
- 总和将使重叠区域的价值更大。
- 如果您的背景不为零,您也可以尝试使用逻辑索引。您将不得不做出一些关于在重叠区域做什么的决定,但这可以很容易地过滤掉背景。
我使用 MATLAB 应用匹配追踪来近似信号。我的问题是我很难想象所选原子的时频表示。我正在尝试生成类似于下图的维格纳图 (source)。
我查看了 Wavelet Toolbox、Signal Processing Toolbox 以及开源的 Time-Frequency Toolbox,但我可能只是使用了错误的参数,因为我在信号处理方面的经验非常有限。
例子
使用this data我的目标是重现上面的情节。
% fit the signal using MP
itermax = 50;
signal = load('signal.txt');
dict = wmpdictionary(length(signal));
[signal_fit, r, coeff, iopt, qual, X] = wmpalg('OMP', signal, dict, ...
'itermax', itermax);
% wigner plot of the simulated signal
tfrwv(signal_fit) % wigner-ville function from time-frequency toolbox
% wigner plot of each atom
atoms = full(dict(:, iopt)) % selected atoms
for i = 1:itermax
tfrwv(atoms(:, i))
end
不幸的是,none 结果图接近目标可视化。请注意,在示例中,我将 tfrwv
与标准参数一起使用,我使用它打开的 GUI 对其进行了调整。
非常感谢你的帮助。
更新
我想我现在已经明白需要使用 Gabor 原子来获得形状类似于拉伸高斯的斑点。不幸的是,信号处理工具箱的预定义指令中没有 Gabor 函数。然而,this question 帮助我实现了所需的字典,这样我得到的原子看起来与示例非常相似:
由于我的情节接近但不完美,还有两个问题悬而未决:
- 我们在第一个示例中看到的所有斑点是否可以单独由 Gabor 原子建模,或者我是否需要另一个函数字典?
- 如何将单独的 imagesc 图组合成一个可视化?
问。如何将单独的 imagesc 图组合成一个可视化?
一个。使用 subplot 绘制多个图,在图中找到下面带有 2 x 2 图的示例。在代码中更改方程式
x = linspace(-5,5);
y1 = sin(x);
subplot(2,2,1)
plot(x,y1)
title('First subplot')
y2 = sin(2*x);
subplot(2,2,2)
plot(x,y2)
title('Second subplot')
y3 = sin(4*x);
subplot(2,2,3)
plot(x,y3)
title('Third subplot')
y4 = sin(6*x);
subplot(2,2,4)
plot(x,y4)
title('Fourth subplot')
回答你的第二个问题'How can I combine the indidividual imagesc plots into a single visualization?'
如果您想使用 imagesc
叠加和显示多个二维矩阵,我建议您取元素方面的最大值。
例如,我生成了两个具有不同均值和方差的高斯分布的 31x31 网格。
function F = generate2dGauss(mu, Sigma)
x1 = -3:.2:3; x2 = -3:.2:3;
[X1,X2] = meshgrid(x1,x2);
F = mvnpdf([X1(:) X2(:)],mu,Sigma);
F = reshape(F,length(x2),length(x1));
end
F1 = generate2dGauss([1 1], [.25 .3; .3 1]);
F2 = generate2dGauss([-1 -1], [.1 .1; .1 1]);
我可以像你的例子一样用子图绘制它们,
figure;
subplot(1,2,1);
title('Atom 1');
imagesc(F1);
subplot(1,2,2);
title('Atom 2');
imagesc(F2);
或者我可以绘制两个网格的每个元素最大值。
figure;
title('Both Atoms');
imagesc(max(F1, F2));
您也可以尝试逐元素均值、总和等,但根据您给出的示例,我认为最大值会给您最干净的结果。
不同功能可能的优缺点:
- 如果您的原子始终具有零值背景且没有负值,则最大值最有效。如果背景为零值,但原子也包含负值,则负值可能会被其他原子的背景所掩盖。如果您的原子重叠,则较高的值当然会占主导地位。
- 平均会让你的峰不那么高,但在原子之间有重叠的地方可能更直观。
- 总和将使重叠区域的价值更大。
- 如果您的背景不为零,您也可以尝试使用逻辑索引。您将不得不做出一些关于在重叠区域做什么的决定,但这可以很容易地过滤掉背景。