МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра БТС ОТЧЕТ по лабораторной работе №4 по дисциплине «Методы обработки биомедицинских сигналов и данных» Тема: СПЕКТРАЛЬНЫЙ АНАЛИЗ ЭКГ ВАРИАНТ 5 Студент гр. 8503 Сумароков А.А. Преподаватель Калиниченко А.Н. Санкт-Петербург 2020 1. Цель работы: Исследование разложения сигнала по методу быстрого преобразования Фурье (БПФ), изучение спектров сигналов ЭКГ в норме и при различных патологиях; 2. Задание на выполнение работы: - Рассчитать и исследовать спектральные оценки тестового сигнала; - Построить графики сигнала, а также амплитудного спектра и спектральной плотности мощности (СПМ); - Рассчитать спектральные оценки для фрагментов ЭКГ, соответствующих трем различным видам сердечного ритма; 3. Основные теоретические положения: При исследовании медико-биологических сигналов часто используются методы спектрального анализа, позволяющие получить численные оценки частотного состава сигнала. Наиболее распространен спектральный анализ, основанный на дискретном преобразовании Фурье: 𝑁−1 2𝜋 𝑋(𝑘 ) = ∑ 𝑥 (𝑛) ∗ 𝑒 −𝑗 𝑁 𝑛𝐾 𝑛=0 где x(n) – отсчёты дискретного сигнала, N – число отсчётов, k = 0,1,.. N-1 – номера частотных составляющих разложения. В данной работе предлагается воспользоваться методом быстрого преобразования Фурье (БПФ). При нормальном ритме в сигнале наблюдаются кратковременные импульсы (QRS-комплексы), при желудочковой тахикардии частота колебаний значительно выше и QRS-комплексы расширены, при фибрилляции желудочков сигнал близок по форме к синусоиде. 4. Данные варианта: Fs, Гц A1 F1, Гц A2 F2, Гц C tmax, с 200 0,7 5 0,9 10 0,35 1,2 5. Код программы: close all clear all Fs=200; A1=0.7; F1=5; A2=0.9; F2=10; C=0.35; tmax=1.2; X0=80; Y0=40; W0=1250; H0=640;x1=50; y1=430; dx=30; dy=30; w1=270; w2=40; h1=150; h2=15; figure('Position',[X0,Y0,W0,H0]) hAxes1=axes('Units','pixels','Position',[x1,y1,2*w1,h1]); hAxes2=axes('Units','pixels','Position',[x1+2*w1+dx,y1,w1,h 1]); hAxes3=axes('Units','pixels','Position',[x1+3*w1+2*dx,y1,w1 ,h1]); hAxes4=axes('Units','pixels','Position',[x1,y1-h1dy,2*w1,h1]); hAxes5=axes('Units','pixels','Position',[x1+2*w1+dx,y1-h1dy,w1,h1]); hAxes6=axes('Units','pixels','Position',[x1+3*w1+2*dx,y1h1-dy,w1,h1]); hAxes7=axes('Units','pixels','Position',[x1,y1-2*h12*dy,2*w1,h1]); hAxes8=axes('Units','pixels','Position',[x1+2*w1+dx,y12*h1-2*dy,w1,h1]); hAxes9=axes('Units','pixels','Position',[x1+3*w1+2*dx,y12*h1-2*dy,w1,h1]); T=1/Fs; t=0:T:tmax-T; S=C+A1*sin(2*pi*F1*t)+A2*sin(2*pi*F2*t); Asum=A1+A2; ft=fft(S); N=tmax*Fs; for j=1:N if (j==1) as(j)=sqrt(real(ft(j))^2+imag(ft(j))^2)/N; else as(j)=sqrt(real(ft(j))^2+imag(ft(j))^2)/N*2; end end df=Fs/N; for j=1:(N/2) f(j)=df*(j-1); end for j=1:N if (j==1) psd(j)=1/N*(real(ft(j))^2+imag(ft(j))^2)/Fs; else psd(j)=2/N*(real(ft(j))^2+imag(ft(j))^2)/Fs; end end m=mean(S); S0=S-m; ft0=fft(S0); for j=1:N if (j==1) as0(j)=sqrt(real(ft0(j))^2+imag(ft0(j))^2)/N; else as0(j)=sqrt(real(ft0(j))^2+imag(ft0(j))^2)/N*2; end end for j=1:N if (j==1) psd0(j)=1/N*(real(ft0(j))^2+imag(ft0(j))^2)/Fs; else psd0(j)=2/N*(real(ft0(j))^2+imag(ft0(j))^2)/Fs; end end w=hamming(N); for j=1:N Sw(j)=S0(j)*w(j); end ftw=fft(Sw); for j=1:N if (j==1) asw(j)=sqrt(real(ftw(j))^2+imag(ftw(j))^2)/N; else asw(j)=sqrt(real(ftw(j))^2+imag(ftw(j))^2)/N*2; end end for j=1:N if (j==1) psdw(j)=1/N*(real(ftw(j))^2+imag(ftw(j))^2)/Fs; else psdw(j)=2/N*(real(ftw(j))^2+imag(ftw(j))^2)/Fs; end end axes(hAxes1) plot(t,S) grid on set(hAxes1,'Ylim',[C-Asum C+Asum]) axes(hAxes2) stem(f,as(1:N/2),'.') axes(hAxes3) plot(f,psd(1:(N/2))) axes(hAxes4) plot(t,S0) grid on set(hAxes4,'Ylim',[-Asum Asum]) axes(hAxes5) stem(f,as0(1:N/2),'.') axes(hAxes6) plot(f,psd0(1:(N/2))) axes(hAxes7) plot(t,Sw) hold on plot(t,w) grid on set(hAxes1,'Ylim',[-Asum Asum]) axes(hAxes8) stem(f,asw(1:N/2),'.') axes(hAxes9) plot(f,psdw(1:(N/2))) Программа, отвечающая за анализ ЭКГ: clear all; close all; X0=80; Y0=40; W0=1250; H0=640; figure('Position',[X0,Y0,W0,H0]) x1=50; y1=430; dx=30; dy=30; w1=270; w2=40; h1=150; h2=15; hAxes1=axes('Units','pixels','Position',[x1,y1,2*w1,h1]); hAxes4=axes('Units','pixels','Position',[x1,y1-h1dy,2*w1,h1]); hAxes7=axes('Units','pixels','Position',[x1,y1-2*h12*dy,2*w1,h1]); hAxes2=axes('Units','pixels','Position',[x1+2*w1+dx,y1,w1,h 1]); hAxes5=axes('Units','pixels','Position',[x1+2*w1+dx,y1-h1dy,w1,h1]); hAxes8=axes('Units','pixels','Position',[x1+2*w1+dx,y12*h1-2*dy,w1,h1]); hAxes3=axes('Units','pixels','Position',[x1+3*w1+2*dx,y1,w1 ,h1]); hAxes6=axes('Units','pixels','Position',[x1+3*w1+2*dx,y1h1-dy,w1,h1]); hAxes9=axes('Units','pixels','Position',[x1+3*w1+2*dx,y12*h1-2*dy,w1,h1]); ECG=load('W4_05.txt'); Fs=250; tmax=4; T=1/Fs; t=0:T:tmax-T; Norma=ECG(:,1); VTach=ECG(:,2); VFibr=ECG(:,3); %Расчеты для Норм N=tmax*Fs; m=mean(Norma); Norma0=Norma-m; w=hamming(N); for j=1:N Normaw(j)=Norma0(j)*w(j); end ft=fft(Normaw); for j=1:N if (j==1) asN(j)=sqrt(real(ft(j))^2+imag(ft(j))^2)/N; else asN(j)=sqrt(real(ft(j))^2+imag(ft(j))^2)/N*2; end end df=Fs/N; for j=1:(N/2) f(j)=df*(j-1); end for j=1:N if (j==1) psdN(j)=1/N*(real(ft(j))^2+imag(ft(j))^2)/Fs; else psdN(j)=2/N*(real(ft(j))^2+imag(ft(j))^2)/Fs; end end m=mean(Norma); Norma0=Norma-m; w=hamming(N); for j=1:N Normaw(j)=Norma0(j)*w(j); end %Расчеты для тахикардии ftT=fft(VTach); N=tmax*Fs; mT=mean(VTach); VTach0=VTach-mT; for j=1:N VTachw(j)=VTach0(j)*w(j); end ftT=fft(VTachw); for j=1:N if (j==1) asT(j)=sqrt(real(ftT(j))^2+imag(ftT(j))^2)/N; else asT(j)=sqrt(real(ftT(j))^2+imag(ftT(j))^2)/N*2; end end for j=1:N if (j==1) psdT(j)=1/N*(real(ftT(j))^2+imag(ftT(j))^2)/Fs; else psdT(j)=2/N*(real(ftT(j))^2+imag(ftT(j))^2)/Fs; end end mT=mean(VTach); VTach0=VTach-mT; for j=1:N VTachw(j)=VTach0(j)*w(j); end %Расчеты для фибрилляции mF=mean(VFibr); VFibr0=VFibr-mF; for j=1:N VFibrw(j)=VFibr0(j)*w(j); end ftF=fft(VFibrw); for j=1:N if (j==1) asF(j)=sqrt(real(ftF(j))^2+imag(ftF(j))^2)/N; else asF(j)=sqrt(real(ftF(j))^2+imag(ftF(j))^2)/N*2; end end for j=1:N if (j==1) psdF(j)=1/N*(real(ftF(j))^2+imag(ftF(j))^2)/Fs; else psdF(j)=2/N*(real(ftF(j))^2+imag(ftF(j))^2)/Fs; end end for j=1:N VFibrw(j)=VFibr0(j)*w(j); end %Графики axes(hAxes1) plot(t,Norma) hold on plot(t,Normaw) grid on axes(hAxes2) stem(f,asN(1:N/2),'.') grid on set(hAxes2,'Xlim',[0 20]) axes(hAxes3) plot(f,psdN(1:(N/2))) grid on set(hAxes3,'Xlim',[0 20]) axes(hAxes4) plot(t,VTach) hold on plot(t,VTachw) grid on axes(hAxes5) stem(f,asT(1:N/2),'.') grid on set(hAxes5,'Xlim',[0 20]) axes(hAxes6) plot(f,psdT(1:(N/2))) grid on set(hAxes6,'Xlim',[0 20]); axes(hAxes7) plot(t,VFibr) hold on plot(t,VFibrw) grid on axes(hAxes8) stem(f,asF(1:N/2),'.') grid on set(hAxes8,'Xlim',[0 20]) axes(hAxes9) plot(f,psdF(1:(N/2))) grid on set(hAxes9,'Xlim',[0 20]) 6. Графические данные: Рис.1 – тестовые сигналы, их амплитудные спектры и СПМ; Рис.2 – сигналы ЭКГ, их амплитудные спектры и СПМ; 7. Выводы по работе: В ходе данной работы мы изучили спектральный анализ и применили его к ЭКГ, построив амплитудные спектры и графики спектральной плотности мощности. Была проверена действенность метода вычитания среднего для избавления от составляющей сигнала на нулевой частоте. Также была изучена работа оконной функции Хэмминга, ее влияние на спектр сигнала. Результатом его работы является снижение спектральной утечки, но в то же время происходит и ухудшение спектрального разрешения.