手动编写连续小波变换代码的查询

信息处理 matlab 频谱 小波
2022-02-01 14:16:44

我想通过matlab手动编写连续小波变换代码。我想使用复杂的 morlet 函数。以下是一些背景知识:
连续小波变换定义: S 是尺度向量。例如是时间滑动。\ psiC(S,T;f(t),ψ(t))=1SSbf(t)ψ(tTS)
1:60;Tψ(t)=1πfbe2πfctet2fb

psi = ((pi*fb)^(-0.5)).*exp(2*1i*pi*fc.*t).*exp(-t.^2/fb); % for example fb=15;fc=1;

我的离散信号有个点。尺度向量中第一个元素的积分的离散版本是: 这必须计算所有尺度, 最后它必须返回一个具有大小的复杂矩阵。我对编写此代码感到困惑。任何人都可以帮忙吗? PS我不想使用matlab函数来计算卷积。 提前致谢。这是我的第一次尝试,但它根本不起作用。Nfor s(i)
CT(s)=n=0N1f(n)ψ(TnS)1:60;
N×S
conv2

%% user CWT
clear all
N=300;                %sample point numbers
t=linspace(0,30,N);
%% signal
x=5*sin(2*pi*0.5*t);  % signal with freq of 0.5 HZ
%% cwt
    fc=1;fb=15;
% psi=((pi*fb)^(-0.5)).*exp(2*1i*pi*fc.*...
%     t).*exp(-t.^2/fb);
%% convolution Psi([N-n]/S)*x(n) so we calculate convolution(psi(n/s),x(n))
    for s=1:60   %scale vector s=[1:1:60]
for i = 1:N      % number of discrete times
       for k = 1:i 
               if ((i-k+1)<N+1) && (k <N+1)
                PSI = ((pi*fb)^(-0.5)).*exp(2*1i*pi*fc.*...
       (t/s)).*exp(-(t/s).^2/fb);   
                        c(i,s) = c(i)+ x(k)*PSI(i-k+1);
                end
       end
end
    end
1个回答

这是我用于 CWT 的 Python 代码。您需要一个简短的 16 位单声道 44.1Khztest.wav声音文件作为输入。

为了计算 CWT,我们需要计算输入x[n]和 morlet 小波之间的卷积。一种有效的方法是这样做ifft(x_ft * morlet_ft) (我将其理解为 : 做傅里叶变换的乘法然后做傅里叶逆变换比直接计算卷积更有效)fg(t)=12π+f^(w)g^(w)eitwdw

from scipy.io.wavfile import read
from pylab import *
import matplotlib.pyplot as plt
import numpy as np
import scipy

# read the file                              
(sr, samples) = read('test.wav')    
x = (np.float32(samples)/((2 ** 15)-1))
N = len(x)
x_fft = np.fft.fft(x)

# scales
J = 200    
scales = np.asarray([2**(i * 0.1) for i in range(J)])

# pre-compute the Fourier transform of the Morlet wavelet 
morletft = np.zeros((J, N))
for i in range(J):
  morletft[i][:N/2] = sqrt(2 * pi * scales[i]) * exp(-(scales[i] * 2 * pi * scipy.array(range(N/2)) / N - 2)**2 / 2.0)

# compute the CWT 
X = empty((J, N), dtype=complex128)
for i in range(J):
  X[i] = np.fft.ifft(x_fft * morletft[i])

# plot
plt.imshow(abs(X[:,scipy.arange(0,N,100)]), interpolation='none', aspect='auto')
plt.show()

这是此代码给出的比例图:

在此处输入图像描述