
今天的文章帶你一步步實現 FCFT,通過 Python 分析訊號並提取特徵。
我會展示如何模擬資料、分離穩定訊號、進行頻域分析,以及提取有用的特徵。
準備好一起享受一場資料探險吧!
固定周期特徵測試到底是什麼?
固定周期特徵測試(Fixed Cycle Features Test, FCFT)的核心理念是專注於設備運行周期中的「穩定狀態訊號」,去除設備啟動或停止過程中的瞬態噪聲。
穩定訊號代表設備在日常運行中的大部分行為,提取它可以讓我們獲得更準確的訊息,並識別異常或故障的早期跡象。
具體流程大致如下:
- 提取穩定狀態訊號(去除瞬態部分)。
- 基於穩定訊號進行特徵提取,比如使用快速傅里葉變換 (FFT) 分析頻譜。
- 根據提取的特徵進行異常偵測、健康狀態分類或預測維護。
模擬資料:步入設備訊號的世界
為了示範這個過程,這邊將會模擬一個包含瞬態和穩定階段的訊號。
如果你手邊沒有工業設備的真實數據,大可放心!
這裡使用 Python 模擬一個訊號就能讓你理解基礎操作。
import numpy as np
import matplotlib.pyplot as plt
# 模擬資料
time = np.linspace(0, 10, 1000) # 時間範圍:0秒到10秒,共1000個點
transient = np.sin(2 * np.pi * 2 * time[:200]) * np.exp(-time[:200]) # 瞬態階段(前200點)
steady_state = np.sin(2 * np.pi * 5 * time[200:]) # 穩定階段(後800點)
# 合併訊號
signal = np.concatenate([transient, steady_state]) # 模擬訊號,包含瞬態和穩定階段
# 可視化訊號
plt.figure(figsize=(10, 4))
plt.plot(time, signal, label="Combined Signal")
plt.axvline(x=2, color='r', linestyle='--', label='Boundary (Transient to Steady)')
plt.xlabel("Time (s)")
plt.ylabel("Signal Amplitude")
plt.title("Analog device signals: transient and steady phases")
plt.legend()
plt.show()

在這裡,我們模擬的訊號分為:
- 瞬態階段:設備啟動時產生的高頻波動。
- 穩定階段:設備穩定運行的狀態(更規律的訊號)。
提取穩定階段訊號:去除噪音,留下規律精華
下一步,我們需要聚焦在穩定訊號部分,去除瞬態訊號的干擾。
這一步非常重要,因為穩定訊號包含更準確的設備健康資訊。
# 提取穩定階段訊號
steady_signal = signal[200:] # 瞬態部分在前200點後
# 繪製提取的穩定訊號
plt.figure(figsize=(10, 4))
plt.plot(time[200:], steady_signal, label="Steady State Signal", color='green')
plt.xlabel("Time (s)")
plt.ylabel("Signal Amplitude")
plt.title("Extracted steady-state phase signals")
plt.legend()
plt.show()

折邊主要是分離穩定階段訊號出來,為後續特徵分析做好準備。
特徵提取:快速傅里葉變換 (FFT) 的魔力
穩定訊號就像一首設備的「歌」,我們可以藉由 FFT 技術解讀它的頻譜特徵。
FFT 是訊號處理工具箱中的一項重要技術,它能幫助我們將「時域」訊號轉換成「頻域」訊號,從而設法找出設備最主要的頻率成分以及訊號的能量分佈。
那我們具體做了什麼呢?
- 時域訊號 (Time Domain):指的是隨著時間變化的訊號。例如,設備振動訊號的幅度會隨著時間而波動。
- 頻域訊號 (Frequency Domain):指的是訊號的頻率成分,可以展現出訊號中存在的主要頻率成分。例如,你可以觀察設備在某一固定頻率的振動幅度。
- FFT 運算:快速傅里葉變換幫我們進行這兩種表示方式的轉換,揭示訊號的頻率特徵。
# fft:用於計算快速傅里葉變換。
# fftfreq:生成對應 FFT 值的頻率範圍。
from scipy.fft import fft, fftfreq
# 計算 FFT
N = len(steady_signal) # 訊號點數:指穩定訊號的點數(樣本大小,也就是訊號的長度)
Fs = 100 # 採樣頻率:假設每秒收集 100 個訊號樣本
frequencies = fftfreq(N, 1/Fs) # 頻率範圍:生成對應於每個 FFT 值的頻率範圍。
fft_values = fft(steady_signal) # FFT 值:計算訊號的 FFT 值,並輸出一個複數陣列。
# 其中:
# - 實部 (Real) 表示振幅大小。
# - 虛部 (Imaginary) 表示相位資訊。
# 通常在振幅分析中,我們只關注複數的模值(也就是振幅大小)。
# 只取正頻率部分:FFT 的結果是對稱的,因此只需取正頻率部分即可。
positive_frequencies = frequencies[:N//2]
positive_fft_values = np.abs(fft_values[:N//2])
# 繪製頻譜圖
plt.figure(figsize=(10, 4))
plt.plot(positive_frequencies, positive_fft_values, label="FFT Spectrum")
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.title("Spectral characteristics of stable signals")
plt.legend()
plt.grid(True)
plt.show()

透過 FFT 頻譜分析,並觀察頻譜,就可以回答以下關鍵問題:
- 設備的主要振動頻率是多少? 主頻率通常對應設備穩定運行的核心頻率,如旋轉速度或運動頻率。
- 是否出現額外的頻率成分(潛在異常)? 額外頻率可能反映部件異常振動,或外部干擾。
提取有用的資料特徵
顧名思義,特徵提取的目的是將訊號的特性格式化出來,有利於進行後續分析。
我們可以提取主頻率和頻譜能量這兩大重要特徵。
# 特徵提取
max_frequency = positive_frequencies[np.argmax(positive_fft_values)] # 主頻率
spectral_energy = np.sum(positive_fft_values**2) # 頻譜能量
print("主頻率 (Max Frequency): {:.2f} Hz".format(max_frequency))
print("頻譜能量 (Spectral Energy): {:.2f}".format(spectral_energy))
主頻率 (Max Frequency): 5.00 Hz
頻譜能量 (Spectral Energy): 159839.35
例如:
- 主頻率:穩定訊號的核心振動頻率,通常代表設備的主要運動頻率。
- 頻譜能量:整個訊號的能量大小,健康設備通常保持穩定的能量分布。
得到的數據特徵可以用於:
- 設備異常檢測(是否新增奇怪頻率?)
- 預測性維護(追蹤頻域特徵的變化趨勢)
最後,讓有用的資料說話
固定周期特徵測試 (FCFT) 是一個簡單但功能強大的工具,特別是在工業訊號分析中。
通過提取穩定狀態訊號並進行頻譜分析,你可以:
- 更準確地監測設備的健康狀態。
- 及早發現潛在異常並進行維護。
如果你的目標是想理解機器設備行為並應用機器學習進行預測,本篇文章應該能帶領你展開有關於訊號分析的基礎。
對頻譜分析或預測性維護感興趣的你,這篇文章可能會對你有所啟發唷!
