Скачиваний:
13
Добавлен:
01.12.2022
Размер:
341.57 Кб
Скачать

Часть 2. Расчет спектральных оценок для фрагментов экг

Текст программы №2:

clc

clear all

close all

ECG=load('W4_04.txt');

Fs=250;

tmax=4;

T=1/Fs;

t=0:T:tmax-T;

Norma=ECG(:,1);

VTach=ECG(:,2);

VFibr=ECG(:,3);

X0=0; % Координата “x” (на экране) нижнего левого угла окна

Y0=0; % Координата “y” (на экране) нижнего левого угла окна

W0=1800; % Ширина окна

H0=800; % Высота окна

figure('Position',[X0,Y0,W0,H0]) % Создание окна

x1=50; % Координата "x" (в окне) нижнего левого угла 1-го поля

dx=50; % Расстояние по “x” между 1-м и 2-м полями

y1=100; % Координата "y" (в окне) нижнего левого угла 1-го поля

w=335; % Ширина 1-го и 2-го полей вывода графиков

h=167; % Высота 1-го и 2-го полей вывода графиков

hAxes=zeros(3,3);

for i=[1 2 3]

% Создание 1-го поля:

hAxes(i,1)=axes('Units','pixels','Position',[x1,y1+(i-1)*(50+h),w+w,h]);

% Создание 2-го поля:

hAxes(i,2)=axes('Units','pixels','Position',[x1+dx+w+w,y1+(i-1)*(50+h),w,h]);

% Создание 3-го поля:

hAxes(i,3)=axes('Units','pixels','Position',[x1+dx+dx+w+w+w,y1+(i-1)*(50+h),w,h]);

end

axes(hAxes(3,1))

plot(t,Norma)

title('Нормальный ритм: сигнал в исходном виде и сигнал после удаления среднего и умножения на окно')

grid on % Нанесение координатной сетки на график

ft=fft(Norma); %Расчет БПФ для сигнала

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

axes(hAxes(3,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

set (hAxes(3,2),'XLim',[0 20])

stem(f,as(1:N/2),'.') % График амплитудного спектра

title('График амплитудного спектра Нормы')

axes(hAxes(3,3))

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

set (hAxes(3,3),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

title('График СПМ Нормы')

m=mean(Norma);

Norma0=Norma-m;

w=hamming(N);

for j=1:N

Normaw(j)=Norma0(j)*w(j);

end

hold on

axes(hAxes(3,1))

hold on

plot(t,Normaw)

grid on % Нанесение координатной сетки на график

ft=fft(Normaw); %Расчет БПФ для сигнала

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

axes(hAxes(3,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

hold on

set (hAxes(3,2),'XLim',[0 20])

stem(f,as(1:N/2),'.') % График амплитудного спектра

axes(hAxes(3,3))

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

hold on

set (hAxes(3,3),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

axes(hAxes(2,1))

plot(t,VTach)

title('Желудочковая тахикардия: сигнал в исходном виде и сигнал после удаления среднего и умножения на окно')

grid on % Нанесение координатной сетки на график

ft=fft(VTach); %Расчет БПФ для сигнала

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

axes(hAxes(2,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

stem(f,as(1:N/2),'.') % График амплитудного спектра

title('График амплитудного спектра Тахикардия')

axes(hAxes(2,3))

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

set (hAxes(2,2),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

title('График СПМ Тахикардия')

m=mean(VTach);

VTach0=VTach-m;

w=hamming(N);

for j=1:N

VTachw(j)=VTach0(j)*w(j);

end

hold on

axes(hAxes(2,1))

hold on

plot(t,VTachw)

grid on % Нанесение координатной сетки на график

ft=fft(VTachw); %Расчет БПФ для сигнала

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

axes(hAxes(2,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

hold on

stem(f,as(1:N/2),'.') % График амплитудного спектра

axes(hAxes(2,3))

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

hold on

set (hAxes(2,3),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

axes(hAxes(1,1))

plot(t,VFibr)

title('Фибрилляция желудочков: сигнал в исходном виде и сигнал после удаления среднего и умножения на окно')

grid on % Нанесение координатной сетки на график

ft=fft(VFibr); %Расчет БПФ для сигнала

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

axes(hAxes(1,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

set (hAxes(1,2),'XLim',[0 20])

stem(f,as(1:N/2),'.') % График амплитудного спектра

title('График амплитудного спектра Фибрилляция желудочков')

axes(hAxes(1,3))

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

set (hAxes(1,3),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

title('График СПМ Фибрилляция желудочков')

m=mean(VFibr);

VFibr0=VFibr-m;

w=hamming(N);

for j=1:N

VFibrw(j)=VFibr0(j)*w(j);

end

hold on

axes(hAxes(1,1))

hold on

plot(t,VFibrw)

grid on % Нанесение координатной сетки на график

ft=fft(VFibrw); %Расчет БПФ для сигнала

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

axes(hAxes(1,2))

df=Fs/N; % Шаг по оси частот

for j=1:(N/2)

f(j)=df*(j-1); % Расчет аргумента для построения графика

end

hold on

set (hAxes(1,2),'XLim',[0 20])

stem(f,as(1:N/2),'.') % График амплитудного спектра

axes(hAxes(1,3))

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

hold on

set (hAxes(1,3),'XLim',[0 20])

plot (f,psd(1:(N/2)))% График СПМ

Рисунок №2 – Спектральные оценки фрагментов ЭКГ

Выводы:

В ходе лабораторной работы были получены спектральные оценки для тестового сигнала и фрагментов ЭКГ. При умножении тестового сигнала на оконную функцию было замечено ухудшение спектрального разрешения.

Сигнал ЭКГ при фибрилляции желудочков имеет меньше гармоник на амплитудном и СПМ спектрах. Эти гармоники находятся на кратных частотах.

Соседние файлы в папке ЛР_4