如何绘制小波变换的频率与幅度?

信息处理 频谱 频率 小波
2022-01-03 03:45:31

我正在运行 Morlet 连续小波变换。我有wscalogram信号,现在我想像下图一样绘制频率幅度,但我不知道该怎么做:

在此处输入图像描述

我使用scal2freqMATLAB 函数将比例转换为伪频率。此外,我的信号中有一些频率具有很大的阻尼比(4%),因此它们在图中不太明显。如何夸大这些高阻尼模式?

我正在使用 MATLAB,这是我的代码:

% Import the text4.txt to matlab workspace. and save it under name "data"
t=linspace(0,30,301);
Fs=ceil(inv(t(2)-t(1)));
x=data(:,4); % use x=data(:,3),x=data(:,5) too. first column is time,second is refrence
wname = 'morl';
scales = 1:1:256;
coefs = cwt(x,scales,wname,'lvlabs');
freq = scal2frq(scales,wname,1/Fs);
surf(t,freq,abs(coefs));shading('interp');
axis tight; xlabel('Seconds'); ylabel('Pseudo-Frequency (Hz)');
axis([0 30 0 1 0 60])
xlabel('Time'); ylabel('Frequency');
figure;
sc=wscalogram('image',coefs,'scales',freq,'ydata',x);
hold on 

我目前的情节是这样的:

在此处输入图像描述

3个回答

稍微修改您的代码,但没有重大更改,无论哪种方式我都会得到正确的结果。在此处使用此模板代码,您应该不会看到任何问题。我得到正确的结果。

clear all; 
t=linspace(0,30,301); 
Fs = (inv(t(2)-t(1))); 
x=randn(100,1);  
wname = 'morl'; 
scales = 1:1:256; 
chefs = cwt(x,scales,wname,'lvlabs');

freq = scal2frq(scales,wname,1/Fs);

figure; 
coefsSquared = abs(coefs).^2; 
imagesc(coefsSquared); 
grid off;

%Pick one of the columsn to plot: 
figure; 
plot(coefsSquared(:,47))

要获得您放置的第一张图像右侧的图形,那就是时间片频谱。换句话说,频率时间矩阵的一列。

例如,我们可能会得到以下频率与时间的平方系数矩阵:

在此处输入图像描述

然后让我们假设我们希望查看第 47 列的时间片的频谱。然后,这里给出:

在此处输入图像描述

在这里,您可以看到对应于第 47 列的时间片的系数的功率与频率的关系。

连续小波变换 (CWT) 是一种时间尺度分析方法。是的,你没看错,是scale,而不是frequency但是,可以将比例映射到频率,甚至非常容易。由于您是 MATLAB 用户,您可能希望使用此函数,它执行以下操作:

F = scal2frq(A,'wname',DELTA) 返回对应于 A 给出的尺度、小波函数 'wname'(有关详细信息,请参阅 wavefun)和采样周期 DELTA 的伪频率。

如您所见,频率不是信号中的真实频率,而是近似值。如果你想要真实的频率,你应该使用短时傅里叶变换 (STFT)。

那么,什么时候应该使用 CWT?作为一般原则,当信号是瞬态的(即快速变化)时,小波工作得很好。

编辑:哈哈,我不知道我在这里做什么。抱歉 :-D 完全错过了您的问题的重点。只看标题....

不确定您是否还需要帮助...

如果您想要频率与幅度,请使用“网格/冲浪”命令来绘制系数。

然后更改绘图的方向,以便获得所需的结果。为此,请参阅“查看”命令。