首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在y轴上绘制呼吸信号的频域图,而时间在x轴上

在y轴上绘制呼吸信号的频域图,而时间在x轴上
EN

Stack Overflow用户
提问于 2018-02-10 19:43:49
回答 1查看 90关注 0票数 0

我有一个呼吸(呼吸)信号和25赫兹的采样频率,需要检测时间尺度上最低的呼吸频率,这应该能告诉我这个人什么时候开始困的。傅立叶变换的经典形式并没有给我太多有用的信息。因此,需要说明的是:测量时间应该在x轴上,呼吸频率应该在y轴上。然后,我认为,信号的较低幅度将显示较慢的呼吸。如何处理信号才能按我需要的方式绘制它?

EN

回答 1

Stack Overflow用户

发布于 2018-02-11 00:29:58

这段代码的所有功劳都归Star Strider所有。

代码语言:javascript
运行
复制
 D = load('respiratory.txt');
    Fs = 25;                                                    % Sampling Frequency (Hz)
    Fn = Fs/2;                                                  % Nyquist Frequency
    Ts = 1/Fs;                                                  % Sampling Time (sec)
    L = numel(D);
    t = linspace(0, L, L)*Ts;                                   % Time Vector (sec)

figure(1)
plot(t, D)
grid
% axis([0  60    -850  -750])
axis([xlim    -850  -750])
xlabel('Time')
ylabel('Amplitude')

FTD = fft(D-mean(D))/L;                                     % Fourier Transform
Fv = linspace(0, 1, fix(L/2)+1)*Fn;                         % Frequency Vector
Iv = 1:numel(Fv);                                           % Index Vector

figure(2)
plot(Fv, abs(FTD(Iv))*2)
grid
axis([0  2.5    ylim])
xlabel('Frequency (Hz)')
ylabel('Amplitude')

Wp = [0.35 0.65]/Fn;                                        % Passband Frequency (Normalised)
Ws = [0.30 0.75]/Fn;                                        % Stopband Frequency (Normalised)
Rp =   1;                                                   % Passband Ripple (dB)
Rs =  50;                                                   % Stopband Ripple (dB)
[n,Ws]  = cheb2ord(Wp,Ws,Rp,Rs);                            % Filter Order
[z,p,k] = cheby2(n,Rs,Ws);                                  % Filter Design, Sepcify Bandpass
[sos,g] = zp2sos(z,p,k);                                    % Convert To Second-Order-Section For Stability

figure(3)
freqz(sos, 2^16, Fs)                                        % Filter Bode Plot

D_filtered = filtfilt(sos, g, D);                           % Filter Signal

[pks,locs] = findpeaks(D_filtered, 'MinPeakDist',40);

figure(4)
plot(t, D_filtered)
hold on
plot(t(locs), pks, '^r')
hold off
grid
% axis([0  60    ylim])
axis([0  60    -15  15])
xlabel('Time')
ylabel('Amplitude')

tdif = diff([0 t(locs)]);                                   % Time Difference Between Peaks (sec)
Dfrq = 60./tdif;                                            % Frequency (Respirations/Minute)

figure(5)
plot(t(locs), Dfrq)
grid
axis([xlim    10  40])
xlabel('Time (sec)')
ylabel('Frequency (minute^{-1})')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48720387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档