⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wavelet_signal01.m

📁 wavelet_signal01.zip能够用于小波计算分析
💻 M
字号:
%用matlab的例子来验证我的STFT的正确性
%越界赋0值
clear ;

sample_rate=500 ;
dt=1.0/sample_rate ;
sample_number=512*2 ;
df=1/(2*dt)/(sample_number/2) ;

%-4 7 40
Ap=-30.0 ;
Bp=85 ;
Cp=30 ;

signal_t=zeros(sample_number,1) ;
signal_y=zeros(sample_number,1) ;

for m=1:sample_number
    signal_t(m)=(m-1)*dt ;
end
for n=1:sample_number
    signal_w(n)=(n-1)/dt/sample_number ;%为频率,单位为HZ
end


for m=1:sample_number
    %signal_y(m)=12*exp(i*2*pi*(Ap*(m-1)*dt*(m-1)*dt*(m-1)*dt+Bp*(m-1)*dt*(m-1)*dt+Cp*(m-1)*dt)) ;
    signal_y(m)=2*12*(m-1)*dt*exp(-3*(m-1)*dt)*exp(i*2*pi*(Ap*(m-1)*dt*(m-1)*dt*(m-1)*dt+Bp*(m-1)*dt*(m-1)*dt+Cp*(m-1)*dt)) ;
end


figure ;
plot(signal_t,real(signal_y)) ;
title('信号的实部时程图','FontSize',8) ;
xlabel('时间(s)','FontSize',8) ;
ylabel('幅值','FontSize',8) ;
hold off ;
figure ;
plot(signal_t,imag(signal_y)) ;
title('信号的虚部时程图','FontSize',8) ;
xlabel('时间(s)','FontSize',8) ;
ylabel('幅值','FontSize',8) ;
hold off ;


%求信号的功率谱
fourier_spec=fft(signal_y,sample_number) ;
power_spec=abs(fourier_spec) ;
figure ;
plot(signal_w,power_spec) ;
title('解析信号的功率图','FontSize',8) ;
xlabel('时间(s)','FontSize',8) ;
ylabel('功率','FontSize',8) ;
hold off ;

signal_phase=unwrap(angle(signal_y)) ;
figure ;
plot(signal_t,signal_phase) ;
title('解析信号的相位图') ;
hold off ;

for n=1:sample_number-1
    diff_phase(n)=(signal_phase(n+1)-signal_phase(n)) ;
end
figure ;
plot(signal_t(1:sample_number-1),diff_phase) ;
title('解析信号的相位差图') ;
hold off ;

instantaneous_frequency=diff_phase./dt./(2*pi) ;
figure ;
plot(signal_t(1:sample_number-1),instantaneous_frequency) ;
title('解析信号的瞬时频率图') ;
hold off ;

%用连续小波分析CWT
wavelet_name='morl' ;%使用小波的名称
center_freq=centfrq(wavelet_name) ;%小波的中心频率
freq_vector=(1:sample_number/4)*df ;%为频率向量,单位为HZ
scale_vector=center_freq./freq_vector/dt ; %由频率向量算出尺度向量
disp([freq_vector',scale_vector']) ;
wavelet_coef = cwt(signal_y,scale_vector,wavelet_name,'plot') ;
%colormap(pink(64)) ;

figure ;
contour(signal_t,freq_vector,(abs(wavelet_coef)).^2,150) ;
colorbar ;
hold off 



iiiiiiiiiiiiiii=0 ;%****暂停处***






%用STFT公式(1)计算信号的时频分布(用外文论文上的公式)
%窗用高斯窗exp(-at*t),a为窗的时间分辩率参数,a越大,窗就越窄,窗的时间分辨率就越好,而频率分辨率就越差
win_parameter=1 ;%win_parameter为高斯窗的时间分辩率参数
for n=1:sample_number
    stft_time(n)=(n-1)*dt ;
    for m=1:sample_number
        if (n+m-1)>sample_number
            temp_stft_signal=0 ;
        else
            temp_stft_signal=signal_y(n+m-1) ;
        end
        temp_stft(m)=temp_stft_signal*exp(-win_parameter*(m-1)*dt*(m-1)*dt) ;
    end
    temp_stft_matrix=fft(temp_stft,sample_number) ;
    stft_matrix(:,n)=temp_stft_matrix' ;
end

power_stft=abs(stft_matrix) ;

for n=1:sample_number
    stft_w(n)=(n-1)/dt/sample_number ;
end

figure ;
contour(stft_time,stft_w(1:sample_number/4),power_stft(1:sample_number/4,:),100) ;
title('用STFT方法计算信号的时频功率谱-等高线图') ;
xlabel('时间(s)','FontSize',30) ;
ylabel('频率(Hz)','FontSize',30) ;
hold off ;

%用维格纳分布(WD)计算信号的时频分布
for n=1:sample_number   %令t为一个常数(n-1)*dt
    wd_time(n)=(n-1)*dt ;
    for m=1:sample_number  %形成WD序列temp(m)=x(t+m/2)*x'(t-m/2)
        if mod(m,2)==0
            if (n+m/2-1)>sample_number
                temp_x1=0 ;
            else
                temp_x1=signal_y(n+m/2-1) ;
            end
            if (n-m/2-1)<1
                temp_x2=0 ;
            else
                temp_x2=signal_y(n-m/2-1) ;
            end         
        else
            if (n+(m+1)/2)>sample_number
                temp_x11=0 ;
            else
                temp_x11=signal_y(n+(m+1)/2) ;
            end
            if (n+(m-1)/2)>sample_number
                temp_x12=0 ;
            else
                temp_x12=signal_y(n+(m-1)/2) ;
            end
            temp_x1=(temp_x11+temp_x12)/2 ;
            
            
            if (n-(m+1)/2)<1
                temp_x21=0 ;
            else
                temp_x21=signal_y(n-(m+1)/2) ;
            end
            if (n-(m-1)/2)<1
                temp_x22=0 ;
            else
                temp_x22=signal_y(n-(m-1)/2) ;
            end
            temp_x2=(temp_x21+temp_x22)/2 ;
            
        end    
        x_new(m)=temp_x1*conj(temp_x2)  ;   
    end
    temp_matrix=fft(x_new,sample_number) ;
    wd_matrix(:,n)=temp_matrix' ;
end
power_wd=abs(wd_matrix) ;

for n=1:sample_number
    wd_w(n)=(n-1)/dt/sample_number ;
end

figure ;
contour(wd_time,wd_w(1:sample_number/4),power_wd(1:sample_number/4,:),100) ;
title('用WD方法计算信号的时频功率谱-等高线图') ;
xlabel('时间(s)','FontSize',30) ;
ylabel('频率(Hz)','FontSize',30) ;
hold off ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -