1. 文件結構
WaveletPeriod/
├── main_wavelet_period.m % 一鍵運行
├── wavelet_power_spectrum.m % 小波功率譜 + 顯著性
├── period_peak_detect.m % 自動周期峰值
├── plot_wavelet_results.m % 時頻圖 + 周期圖
└── example/└── temp.csv % 示例月平均溫度
2. 核心函數
① 小波功率譜(wavelet_power_spectrum.m)
function [W, period, scale, sig95] = wavelet_power_spectrum(x, dt, mother)
% 輸入:
% x : 1×N 時間序列
% dt : 采樣間隔(月/日/年)
% mother: 'Morlet'(默認)
% 輸出:
% W : 小波功率譜(N×Nscale)
% period: 周期向量(與 W 行對應)
% sig95 : 95% 顯著性水平if nargin<3, mother = 'Morlet'; end
% 1. 選擇母小波
[wave, scale] = morlet_wavelet(length(x), dt);
% 2. 連續小波變換
W = cwt(x, scale, wave);
% 3. 顯著性檢驗(紅噪聲背景)
sig95 = red_noise_significance(x, dt, scale);
end
② Morlet 母小波生成(morlet_wavelet.m)
function [wave, scale] = morlet_wavelet(N, dt)
s0 = 2*dt; % 最小尺度
dj = 0.125; % 尺度步長
J = floor(log2(N)*dj^-1);
scale = s0 * 2.^((0:J)*dj);
wave = { @(s,t) pi^(-0.25) .* exp(1j*5*t./s) .* exp(-0.5*(t./s).^2) };
end
③ 顯著性檢驗(紅噪聲背景)
function sig95 = red_noise_significance(x, dt, scale)
% Torrence & Compo 紅噪聲顯著性
alpha = ar1_coeff(x); % 估計 AR(1) 系數
varx = var(x);
sig95 = varx * (1-alpha^2) ./ (1 - 2*alpha*cos(2*pi/(scale/dt)) + alpha^2);
sig95 = sig95 * 0.95; % 95% 分位
end
3. 運行(main_wavelet_period.m)
clear; clc; close all; addpath('.');%% 1. 讀入時間序列(月平均溫度)
data = readmatrix('example/temp.csv'); % 兩列:日期, 溫度
t = data(:,1); x = data(:,2);
dt = 1; % 月間隔%% 2. 小波功率譜
[W, period, scale, sig95] = wavelet_power_spectrum(x, dt);%% 3. 周期峰值檢測
[pkPer, pkVal] = period_peak_detect(W, period);%% 4. 可視化
plot_wavelet_results(t, x, W, period, sig95, pkPer, pkVal);
4. 結果可視化(plot_wavelet_results.m)
- 左側:小波功率譜時頻圖(暖色 = 高能量)
- 右側:全局小波譜(藍線)+ 95% 顯著性(紅線)+ 峰值標注
示例輸出:
- 顯著周期:12 個月(年循環)
- 次峰值:6 個月(半年諧波)
參考代碼 用于時間序列的小波周期分析 www.youwenfan.com/contentcsh/53539.html
5. 結果指標(示例月溫度)
周期 | 能量峰值 | 顯著性 |
---|---|---|
12 月 | 0.84 | >95 % |
6 月 | 0.31 | >95 % |