文章目錄
- 1. 信號預處理 - 去直流分量
- 2. 快速傅里葉變換(FFT)
- 3. 功率譜密度(PSD)計算
- 4. 主頻率檢測
- 5. 譜質心計算
- 6. 對數譜顯示
- 完整的信號處理流程
- 實際應用示例
1. 信號預處理 - 去直流分量
data = data - mean(data);
數學原理:
去除信號的直流分量(DC offset),即:
xcentered[n]=x[n]?μx_{centered}[n] = x[n] - \muxcentered?[n]=x[n]?μ
其中:
- μ=1N∑n=0N?1x[n]\mu = \frac{1}{N}\sum_{n=0}^{N-1} x[n]μ=N1?∑n=0N?1?x[n] 是信號均值
- NNN 是信號長度
作用: 去除0Hz分量,避免在頻譜圖中出現很大的直流峰值,影響其他頻率成分的觀察。
2. 快速傅里葉變換(FFT)
Y = fft(data, nfft);
f = (0:nfft-1) * fs / nfft;
數學原理:
離散傅里葉變換(DFT)公式:
X[k]=∑n=0N?1x[n]?e?j2πkn/NX[k] = \sum_{n=0}^{N-1} x[n] \cdot e^{-j2\pi kn/N}X[k]=n=0∑N?1?x[n]?e?j2πkn/N
其中:
- k=0,1,...,N?1k = 0, 1, ..., N-1k=0,1,...,N?1 是頻率索引
- N=nfft=212=4096N = nfft = 2^{12} = 4096N=nfft=212=4096 是FFT點數
頻率分辨率:
Δf=fsnfft\Delta f = \frac{f_s}{nfft}Δf=nfftfs??
頻率向量計算:
f[k]=k?fsnfft,k=0,1,...,nfft?1f[k] = k \cdot \frac{f_s}{nfft}, \quad k = 0, 1, ..., nfft-1f[k]=k?nfftfs??,k=0,1,...,nfft?1
3. 功率譜密度(PSD)計算
PSD = abs(Y).^2 / (fs * nfft);
PSD = PSD(1:nfft/2+1);
f = f(1:nfft/2+1);
PSD(2:end-1) = 2 * PSD(2:end-1);
數學原理:
Step 1: 計算功率譜
PSD[k]=∣X[k]∣2fs?NPSD[k] = \frac{|X[k]|^2}{f_s \cdot N}PSD[k]=fs??N∣X[k]∣2?
這里除以 fs?Nf_s \cdot Nfs??N 是為了得到功率譜密度(單位:功率/Hz)。
Step 2: 單邊譜轉換
由于實信號的FFT結果具有共軛對稱性:
X[k]=X?[N?k]X[k] = X^*[N-k]X[k]=X?[N?k]
所以只需要保留前一半頻率(0到fs/2f_s/2fs?/2),但要將功率翻倍(除了0Hz和Nyquist頻率):
PSD(2:end-1) = 2 * PSD(2:end-1);
數學表達:
PSDsingle[k]={PSD[k],k=0或?k=N/22?PSD[k],1≤k<N/2PSD_{single}[k] = \begin{cases} PSD[k], & k = 0 \text{ 或 } k = N/2 \\ 2 \cdot PSD[k], & 1 \leq k < N/2 \end{cases}PSDsingle?[k]={PSD[k],2?PSD[k],?k=0?或?k=N/21≤k<N/2?
4. 主頻率檢測
[~, peak_idx] = max(PSD(2:end));
main_freq = f(peak_idx + 1);
數學原理:
找到功率譜密度的最大值對應的頻率:
fmain=arg?max?f>0PSD(f)f_{main} = \arg\max_{f > 0} PSD(f)fmain?=argf>0max?PSD(f)
注意:從索引2開始是為了排除直流分量(0Hz)。
5. 譜質心計算
centroid = sum(f_col .* PSD_col) / sum(PSD_col);
數學原理:
譜質心(Spectral Centroid)是頻譜的"重心":
fcentroid=∑k=0N/2f[k]?PSD[k]∑k=0N/2PSD[k]f_{centroid} = \frac{\sum_{k=0}^{N/2} f[k] \cdot PSD[k]}{\sum_{k=0}^{N/2} PSD[k]}fcentroid?=∑k=0N/2?PSD[k]∑k=0N/2?f[k]?PSD[k]?
這是一個加權平均,權重是各頻率的功率。
物理意義:
- 譜質心反映了信號能量在頻域的分布中心
- 值越大,說明高頻成分越多
- 常用于音頻信號分析中表征音色"明亮度"
6. 對數譜顯示
semilogx(f, 10*log10(PSD));
數學原理:
將功率譜密度轉換為分貝(dB)單位:
PSDdB=10log?10(PSD)PSD_{dB} = 10 \log_{10}(PSD)PSDdB?=10log10?(PSD)
使用對數坐標的原因:
- 人耳對頻率的感知是對數的
- 可以同時顯示大范圍的幅值差異
- 更容易觀察低幅值的頻率成分
完整的信號處理流程
原始信號 x[n]↓ (去直流)
中心化信號 x_c[n] = x[n] - μ↓ (FFT)
頻域信號 X[k]↓ (功率計算)
雙邊功率譜 |X[k]|2/(fs·N)↓ (單邊譜轉換)
單邊功率譜密度 PSD[k]↓ (特征提取)
主頻率 + 譜質心
實際應用示例
假設采樣率 fs = 1000 Hz,信號包含50Hz和120Hz兩個正弦波:
t = 0:1/fs:1;
x = sin(2*pi*50*t) + 0.5*sin(2*pi*120*t);
經過上述處理后:
- 主頻率將是 50 Hz(因為其幅度更大)
- 譜質心將在 50-120 Hz 之間,偏向50Hz