Morlet小波变换函数返回无意义的情节

时间:2016-05-06 06:48:09

标签: matlab plot wavelet

我编写了一个matlab函数(版本7.10.0.499(R2010a))来评估输入的FT信号并计算信号的Morlet小波。我有一个类似的程序,但我需要让它更具可读性,更接近数学术语。输出图应该是2D图,其颜色显示频率的强度。我的情节似乎每次都有相同的频率。该程序确实为每个频率每行产生一个fft,所以我想另一种看待它的方法是在我的for循环中每一步重复相同的行。问题是我已经检查了原始程序,它确实返回了正确的绘图,除了我命名的值以及我如何组织代码之外,我找不到任何差异。

function[msg] = mile01_wlt(FT_y, f_mn, f_mx, K, N, F_s)
%{
Fucntion to perform a full wlt of a morlet wavelett.
optimization of the number of frequencies to be included. 
FT_y satisfies the FT(x) of 1 envelope and is our ft signal.
f min and max enter into the analysis and are decided from 
the f-image for optimal values.
While performing the transformation there are different scalings
on the resulting "intensity".
Plot is made with a 2D array and a colour code for intensity. 
version 05.05.2016
%}

%--------------------------------------------------------------%
%{
tableofcontents:
    1: determining nr. of analysis f, prints and readies f's to be used.
    2: ensuring correct orientation of FT_y
    3:defining arrays
    4: declaring waveletdiagram and storage of frequencies
    5: for-loop over all frequencies:
    6: reducing file to manageable size by truncating time.
    7: marking plot to highlight ("randproblemer")
    8: plotting waveletdiagram
%}

%--------------------------------------------------------------%
%1: determining nr. of analysis f, prints and readies f's to be used.
    DF = floor( log(f_mx/f_mn) / log(1+( 1/(8*K) ) ) ) + 1;% f-spectre analysed
    nr_f_analysed = DF              %output to commandline
    f_step = (f_mx/f_mn)^(1/(DF-1)); % multiplicative step for new f_a
    f_a = f_mn; %[Hz] frequency of analysis
    T = N/F_s; %[s] total time sampled
    C = 2.0; % factor to scale Psi

%--------------------------------------------------------------%
%2: ensuring correct orientation of FT_y
    siz = size(FT_y);
    if (siz(2)>siz(1)) 
        FT_y = transpose(FT_y);
    end;

%--------------------------------------------------------------%    
%3:defining arrays
    t = linspace(0, T*(N-1)/N, N); %[s] timespan
    f = linspace(0, F_s*(N-1)/N, N); %[Hz] f-specter

%--------------------------------------------------------------%
%4: declaring waveletdiagram and storage of frequencies
    WLd = zeros(DF,N); % matrix of DF rows and N collumns for storing our wlt
    f_store = zeros(1,DF); % horizontal array for storing DF frequencies

%--------------------------------------------------------------%
%5: for-loop over all frequencies:
    for jj = 1:DF
        o = (K/f_a)*(K/f_a); %factor sigma
        Psi = exp(- 0*(f-f_a).*(f-f_a)); % FT(\psi) for 1 envelope
        Psi = Psi - exp(-K*K)*exp(- o*(f.*f)); % correctional element
        Psi = C*Psi; %factor. not set in stone

        %next step fits 1 row in the WLd (3 alternatives)
        %WLd(jj,:) = abs(ifft(Psi.*transpose(FT_y))); 
        WLd(jj,:) = sqrt(abs(ifft(Psi.*transpose(FT_y))));
        %WLd(jj,:) = sqrt(abs(ifft(Psi.*FT_y))); %for different array sizes
                                                %and emphasizes weaker parts.
        %prep for next round
        f_store (jj) = f_a; % storing used frequencies
        f_a = f_a*f_step; % determines the next step
    end;

%--------------------------------------------------------------%
%6: reducing file to manageable size by truncating time.
    P = floor( (K*F_s) / (24*f_mx) );%24 not set in stone
    using_every_P_point = P %printout to cmdline for monitoring
    N_P = floor(N/P);
    points_in_time = N_P %printout to cmdline for monitoring
    % truncating WLd and time
    WLd2 = zeros(DF,N_P);
    for jj = 1:DF
        for ii = 1:N_P
            WLd2(jj,ii) = WLd(jj,ii*P);
        end
    end
    t_P = zeros(1,N_P);
    for ii = 1:N_P % set outside the initial loop to reduce redundancy
        t_P(ii) = t(ii*P);
    end

%--------------------------------------------------------------%
%7: marking plot to highlight boundary value problems
    maxval = max(WLd2);%setting an intensity
    mxv = max(maxval);
    % marks in wl matrix
    for jj= 1:DF
        m = floor( K*F_s / (P*pi*f_store(jj)) ); %finding edges of envelope
        WLd2(jj,m) = mxv/2; % lower limit
        WLd2(jj,N_P-m) = mxv/2;% upper limit
    end

%--------------------------------------------------------------%
%8: plotting waveletdiagram
    figure;
    imagesc(t_P, log10(f_store), WLd2, 'Ydata', [1 size(WLd2,1)]);
    set(gca, 'Ydir', 'normal');
    xlabel('Time [s]');
    ylabel('log10(frequency [Hz])');
    %title('wavelet power spectrum'); % for non-sqrt inensities
    title('sqrt(wavelet power spectrum)'); %when calculating using sqrt
    colorbar('location', 'southoutside');
    msg = 'done.';

没有错误信息,所以我不确定我到底做错了什么。 希望我遵循所有准则。否则,我道歉。

编辑: 我的通话程序:    %建立参数     N = 2 ^(16); %|要抽样的点数     F_s = 3.2e6; %Hz |采样频率     T_t = N / F_s; %s |采样时间的长度,以秒为单位     f_c = 2.0e5; %Hz |携带波频率     f_m = 8./T_t; %Hz |调制波频率     w_c = 2 * pi * f_c; %Hz |载波的角频率(“Ω”)     w_m = 2 * pi * f_m; %Hz |调制波的角频率(“ω”)

% establishing parameter arrays
t = linspace(0, T_t, N);

% function variables
T_h = 2*f_m.*t; % dimless | 1/2 of the period for square signal

% combined carry and modulated wave
% y(t) eq. 1):
y_t = 0.5.*cos(w_c.*t).*(1+cos(w_m.*t)); 
% y(t) eq. 2):
%     y_t = 0.5.*cos(w_c.*t)+0.25*cos((w_c+w_m).*t)+0.25*cos((w_c-w_m).*t);
%square wave
sq_t = cos(w_c.*t).*(1 - mod(floor(t./T_h), 2)); % sq(t)

% the following can be exchanged between sq(t) and y(t) 

plot(t, y_t)
% plot(t, sq_t)
xlabel('time [s]');
ylabel('signal amplitude');
title('plot of harmonically modulated signal with carrying wave');
% title('plot of square modulated signal with carrying wave');
figure()
hold on

% Fourier transform and plot of freq-image
FT_y = mile01_fftplot(y_t, N, F_s);
% FT_sq = mile01_fftplot(sq_t, N, F_s);

% Morlet wavelet transform and plot of WLdiagram
%determining K, check t-image
K_h = 57*4; % approximation based on 1/4 of an envelope, harmonious
%determining f min and max, from f-image
f_m = 1.995e5; % minimum frequency. chosen to showcase all relevant f
f_M = 2.005e5; % maximum frequency. chosen to showcase all relevant f
%calling wlt function.
name = 'mile'
msg = mile01_wlt(FT_y, f_m, f_M, K_h, N, F_s)
siz = size(FT_y);
if (siz(2)>siz(1)) 
    FT_y = transpose(FT_y);
end;
name = 'arnt'
msg = arnt_wltransf(FT_y, f_m, f_M, K_h, N, F_s)

时间图像具有恒定频率,但幅度振荡重新调整高斯曲线。我的代码会随着时间的推移返回一个截然分割的图像,其中每个时间点只保持1个频率。它应反映光谱随时间的强度变化。 希望有所帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了错误。在Psi的第一个实例中有一个0而不是o。我想我可能会将这个值重命名为sig或者其他东西。除此之外,代码有效。对不起那里的麻烦