在Matlab中应用Wigner-Ville分布的窗口函数

时间:2013-12-25 22:25:38

标签: matlab signal-processing time-frequency

我们在考虑here如何创建重叠的汉明-64窗口64。 它是由

完成的
h = hamming(64);
h2 = hamming(38);
h = conv(h, h2);

现在,我们正在考虑如何将此窗口函数应用于Time-Frequency Toolbox中Auger等人的Wigner-Ville分布函数的结果变量。 函数tfrwv.m没有窗口函数的任何参数。

所以我们有这些变量

[B,T,F] = tfrwv(data, 1:length(data), length(data));

Here是相关问题的一个答案,但不完全相同。 有人说将窗口函数应用于结果

  

只需逐点增加

h 的尺寸为101x1双倍,而 T F 5001x1加倍。 因此,如果逐点相乘,窗口向量似乎需要外推。

还有一个解释here

  

在第二个代码块的大约一半时,我应用了一个窗口   对缓冲信号起作用。这实际上是一个向量   窗口函数与每个缓冲的时间块相乘   系列数据。我只是使用偷偷摸摸的对角矩阵技巧来做到这一点   有效。

如何将窗口函数应用于变量 B,T, F

4 个答案:

答案 0 :(得分:1)

查看有关Wigner分发的this paper。从第8页到第11页。我认为代码中的tfr(indices,icol) = x(ti+tau,1) .* conj(x(ti-tau,xcol));实现了公式(23)。和和指数部分相当于tfr= fft(tfr);。或者您也可以将我引用的那两行代码视为公式(24)。注意:在论文和代码中,他们假设信号是N/2的周期性信号,其中Nlength(data)。没关系,您无需在此处更改data。他们只是对原始数据进行了各种扩展。

引用文章 在处理WDF之前,应用了修改后的汉明窗口 时域信号,以减少由不连续性引起的泄漏 有限的数据记录,将被称为数据逐渐减少。 据我所知,你在这里可以做的是

data1 = conv(h,data);
[B,T,F] = tfrwv(data1, 1:length(data1), length(data1)); 

我的答案是根据您的实施完成的。你现在可以尝试一下。


我不完全理解的是你创建Hamming-64重叠窗口60%的方法。在spectrogram中,代码会将您的data拆分为每个长度为64的小段。如果您希望spectrogramtfrwv达到相同的效果,我想你可能还需要拆分data,并分别使用conv(data(1:64),hamming(64))conv(data(38:101),hamming(64))conv(data(76:139),hamming(64)),....作为tfrwv的输入。

答案 1 :(得分:0)

扩展到lennon310的答案。

我跑

data1 = conv(h,data);
[B,T,F] = tfrwv(data1, 1:length(data1), length(data1));

然后用无窗口的图片绘制

enter image description here

我知道没有窗口的图片是正确的,因为我可以看到由MIT-BIH心律失常数据库中的测量系统的设置引起的60Hz水平线。 患者年龄为68岁,患有老年心肌梗塞,因此每秒节拍达到65次是合适的。

实现原始版本的hamming-64的图片不合适。 这个人不会每分钟都有这样的节拍。

答案 2 :(得分:0)

第二次延伸到lennon310的回答

data1 = conv(data(1:64),hamming(64)); [B,T,F] = tfrwv(data1, 1:length(data1), length(data1));    
data1 = conv(data(38:101),hamming(64)); [b,t,f] = tfrwv(data1, 1:length(data1), length(data1));

我不知道应该如何将 b 的数据与 B 结合起来。 矩阵对角化似乎不是合适的选择。

我仅使用hamming(64)进行简化,讨论here关于矩阵对角化的实现

    B = 0; T = 0; F = 0;    
    data1 = conv(data(1 : 64),hamming(64)); [B,T,F] = tfrwv(data1, 1:length(data1), length(data1));    
    for i=1:10
        data1 = conv(data( 1 + i*37 : 64 + i*37 ),hamming(64)); [b,t,f] = tfrwv(data1, 1:length(data1), length(data1));    
        B = blkdiag(B,b); T = [T t]; F = [F; f];
    end

我得到了

enter image description here

这不是正确的结果。 问题在于理解矩阵 B 应该是什么。 b 添加到 B 后矩阵B应该是什么样?

答案 3 :(得分:0)

在我的第三次延期中,有一个错误及其症状是lennon310的答案。 lennon310答案的第4次延期

我跑

h = hamming(64);
h2 = hamming(38);
h = conv(h, h2);    
B = 0; T = 0; F = 0;    
data1 = filter(data(1 : 64),1,h); [B,T,F] = tfrwv(data1, 1:length(data1), length(data1));    
for i=1:133
    data1 = filter(data( 1 + i*37 : 64 + i*37 ),1,h); [b,t,f] = tfrwv(data1, 1:length(data1), length(data1));    
    B = [B b']; T = [T t]; F = [F; f];       
end
data1 = filter(data(4959 : 5001),1,h); [b,t,f] = tfrwv(data1, 1:length(data1), length(data1));    
B = [B b']; T = [T t]; F = [F; f];       
T = 49.8899*T;      % dummy constant to get appropriate time interval

并获得这样的照片

enter image description here

我没有设法在一张照片中显示所有薄的峰值。 关于它的新问题here

我正在通过

绘图
t = 1/360; % 360 samples per second
fs = 360.5;
imagesc(T*t, F*fs, abs(B))

算法正在将点累积到正确的维度。 我不确定是否乘以虚拟常数是提前行走的正确方法。