基于MATLAB的膝关节振动信号(VAG)分析的简单模拟研究与实现
目标:
- 区分正常与病理性膝关节VAG信号:通过模拟信号生成、滤波、峰值检测与时频分析,判断信号是否异常。
- 关键指标:基于滤波后信号的峰值数量(>30则判定为异常)。
模块:
(1) 信号生成
- 正常信号:vag_normal = sin(2*pi*50*t) + 0.2*randn(size(t))
- 设计意图:50Hz正弦波模拟正常关节振动,叠加弱噪声(标准差0.2)。
- 病理性信号:vag_pathology = sin(2*pi*50*t) + 1.0*sin(2*pi*120*t) + 0.7*randn(size(t))
- 设计意图:在50Hz基础上添加120Hz高频成分(幅度1.0)和强噪声(标准差0.7),模拟病理特征。
(2) 滤波设计
- 滤波器类型:3阶巴特沃斯带通滤波器(20-250Hz)。
- 作用:保留VAG信号主要频段(20-250Hz),抑制低频肌电干扰和高频噪声。
- 实现:butter(3, [20 250]/(fs/2), bandpass) + filtfilt(零相位滤波)。
- 优点:filtfilt消除相位失真,确保峰值时间对齐。
(3) 峰值检测
- 正常信号参数:MinPeakHeight=0.5, MinPeakDistance=fs/20(50ms间隔)。
- 病理性信号参数:MinPeakHeight=0.3, MinPeakDistance=fs/50(20ms间隔)。
- 设计意图:病理性信号预期有更多密集高频峰值,降低高度阈值和最小间隔以捕获更多峰值。
(4) 异常判断
- 阈值:peak_threshold = 30(总峰值数 >30 判定为异常)。
- 逻辑验证:正常信号预期峰值较少,病理性信号因高频成分和噪声导致峰值增多。
% Define Sampling Frequency and Time Vectorfs = 1000; % Sampling frequency in Hzduration = 5; % Duration of signal in secondst = 0:1/fs:duration-1/fs; % Time vector
% Simulate Normal and Pathological VAG Signalsvag_normal = sin(2*pi*50*t) + 0.2*randn(size(t)); % Normal VAG: 50 Hz with noisevag_pathology = sin(2*pi*50*t) + 1.0*sin(2*pi*120*t) + 0.7*randn(size(t)); % Pathological: 50 Hz + 120 Hz with increased amplitude% Bandpass Filter Design (20-250 Hz)[b, a] = butter(3, [20 250]/(fs/2), bandpass); % 3rd order Butterworth bandpass filter
% Apply Bandpass Filtervag_normal_filtered = filtfilt(b, a, vag_normal); % Filter normal signalvag_pathology_filtered = filtfilt(b, a, vag_pathology); % Filter pathological signal% Detect Peaks in Filtered Signals% Adjust parameters to detect more peaks in pathological signal[peaks_normal, locs_normal] = findpeaks(vag_normal_filtered, MinPeakHeight, 0.5, MinPeakDistance, fs/20);[peaks_pathology, locs_pathology] = findpeaks(vag_pathology_filtered, MinPeakHeight, 0.3, MinPeakDistance, fs/50); % Lower height, closer peaks
% Define Abnormality Detection Thresholdpeak_threshold = 30; % Number of peaks threshold for abnormal detection% Abnormality Detection Logic (Based on Filtered Signals)is_abnormal_normal = length(peaks_normal) > peak_threshold; % True if abnormalis_abnormal_pathology = length(peaks_pathology) > peak_threshold; % True if abnormal% Generate Abnormality Status Stringsnormal_status = No Detection; % Default for normal signalif is_abnormal_normal normal_status = Yes Detection;endpathological_status = No Detection; % Default for pathological signalif is_abnormal_pathology pathological_status = Yes Detection;end% Visualizationfigure(Name, Knee Joint VAG Signal Analysis, NumberTitle, off);% Plot 1: Original Normal Signalsubplot(4, 2, 1);plot(t, vag_normal);xlabel(Time (s));ylabel(Amplitude);title(Original Normal VAG Signal);grid on;% Plot 2: Original Pathological Signalsubplot(4, 2, 2);plot(t, vag_pathology);xlabel(Time (s));ylabel(Amplitude);title(Original Pathological VAG Signal);grid on;% Plot 3: Filtered Normal Signal with Detected Peakssubplot(4, 2, 3);plot(t, vag_normal_filtered);hold on;plot(locs_normal/fs, peaks_normal, ro); % Mark peaksxlabel(Time (s));ylabel(Amplitude);title(Filtered Normal VAG Signal with Peaks);grid on;% Plot 4: Filtered Pathological Signal with Detected Peakssubplot(4, 2, 4);plot(t, vag_pathology_filtered);hold on;plot(locs_pathology/fs, peaks_pathology, ro); % Mark peaksxlabel(Time (s));ylabel(Amplitude);title(Filtered Pathological VAG Signal with Peaks);grid on;% Plot 5: Spectrogram of Filtered Normal Signalsubplot(4, 2, 5);spectrogram(vag_normal_filtered, 256, 200, 512, fs, yaxis);title(Spectrogram of Filtered Normal VAG Signal);xlabel(Time (s));ylabel(Frequency (Hz));colorbar;% Plot 6: Spectrogram of Filtered Pathological Signalsubplot(4, 2, 6);spectrogram(vag_pathology_filtered, 256, 200, 512, fs, yaxis);title(Spectrogram of Filtered Pathological VAG Signal);xlabel(Time (s));ylabel(Frequency (Hz));colorbar;% Plot 7: Normal Signal Analysis Summarysubplot(4, 2, 7);text(0.1, 0.5, { Normal VAG Signal Analysis Summary:, ... [Number of Peaks Detected: , num2str(length(peaks_normal))], ... [Abnormal Detection: , normal_status]}, ... FontSize, 10);axis off;% Plot 8: Pathological Signal Analysis Summarysubplot(4, 2, 8);text(0.1, 0.5, { Pathological VAG Signal Analysis Summary:, ... [Number of Peaks Detected: , num2str(length(peaks_pathology))], ... [Abnormal Detection: , pathological_status]}, ... FontSize, 10);axis off;% Display Summary in Command Windowdisp(---- VAG Signal Analysis Summary ----);disp([Normal Signal - Peaks Detected: , num2str(length(peaks_normal)), -> Abnormal Detection: , normal_status]);disp([Pathological Signal - Peaks Detected: , num2str(length(peaks_pathology)), -> Abnormal Detection: , pathological_status]);Normal Signal - Peaks Detected: 72 -> Abnormal Detection: Yes Detection
Pathological Signal - Peaks Detected: 153 -> Abnormal Detection: Yes Detection
图片
本文转载自高斯的手稿



