gpt4 book ai didi

matlab - 如何在Matlab代码的一个音频 channel 上同时输出由两个具有不同时间段的信号组成的复合信号?

转载 作者:行者123 更新时间:2023-12-02 23:55:05 25 4
gpt4 key购买 nike

%-------------------------------------------------------------------

% Function to Generate ECG of 1 heart beat signal

function [Heartbeat,t1] = ECG_Gen (HR,pulse_width,Amp)

Fs = 48000;

delay = ((60/HR)/2)-(0.5*pulse_width);

t1 = -delay:(1/Fs):delay;

Heartbeat = Amp*tripuls (t1,pulse_width);

%-------------------------------------------------------------------
%Test Circuit configuration

function [FECG_MECG,Mixed_ECG,fastTime] = Test_Circuit (FHR,MHR)

Fs = 48000;
%FHR = 150;
%MHR = 60;
Fpulse_width = 30e-3;
Mpulse_width = 60e-3;
FAmp = 0.2;
MAmp = 0.5;

% Fetal ECG Gen
%------------------------------------------------

[FECG,FHR_Delay]= ECG_Gen (FHR,Fpulse_width,FAmp);

% Maternal ECG Gen
%------------------------------------------------

[MECG,MHR_Delay]= ECG_Gen (MHR,Mpulse_width,MAmp);

% Composite signal implementation
%------------------------------------------------

% Set parameters for Composite signal Algorithms

if length (MECG) > length (FECG) % Check for time sequences for both ECG signal
slowECG = FECG; % Set interpolation to slower rate
fastECG = MECG;
timeSeg = length(MECG);
fastTime = MHR_Delay; % Set sampling times
slowTime = FHR_Delay;
else
slowECG = MECG;
fastECG = FECG;
timeSeg = length(FECG);
fastTime = FHR_Delay;
slowTime = MHR_Delay;
end

FECG_MECG = zeros (timeSeg,2); % To hold stereo output

FECG_MECG(:,2) = fastECG(1,:); % Assign higher rate signal to one channel

% Interpolation on the slower rater sampled ECG

slowECGInterp = interp1 (slowTime,slowECG,fastTime);

slowECG = num2cell(slowECGInterp); % Conversion to cell Array in order to remove NaN

slowECG(cellfun(@(slowECG) any(isnan(slowECG)),slowECG)) = [];

slowECG = cell2mat(slowECG);

j = 1;

for i = 1:timeSeg

FECG_MECG(i,1) = slowECG(1,j);

if j == length(slowECG)
j = 0;
end

j = j+1;
end

Mixed_ECG = FECG_MECG(:,1) + FECG_MECG(:,2); % to hold mono output






%while (1)
%sound(Mixed_ECG ,Fs);
%end

%-------------------------------------------------------------------
% Test Wave script

clear all
%clc
clc
Fs = 48000;

%for i = 1:3
%toc

MHR = 60;
FHR = 200;

% Obtain ECG interpolated signal and composite
[FECG_MECG,Mixed_ECG,fastTime] = Test_Circuit (FHR,MHR);

% for test purposes
[MECG,MHR_Delay]= ECG_Gen (60,60e-3,0.5);

%t = timer ('TimerFcn','stat=false','Period',2.0);
wavwrite (FECG_MECG(:,2),Fs,'ECGwav.wav');
i = 0;
a = 1;
tic
while (1)

while (toc < 20*a)

sound (MECG,Fs);

end
toc
a = a+1;
[MECG,MHR_Delay]= ECG_Gen (60*a,60e-3,0.5);

if a > 4
break
end

end

%start(t)
%tic
%t = cputime;

%y = wavread('ECGwav.wav');


%while (1)
% sound(y,Fs);
%end
%toc

嘿非常感谢您再次与我联系,我已经利用了您的插值法,但是从Monitor获得的读数仍然有一些小问题。拳头说,我有一个固定时间周期为0.8s的恒定信号,我想添加例如0.3s的复合信号,我设法使用您的插值方法以0.8的速率对0.3s信号进行采样的信号。我想我已经解决了这个问题。第二个问题是关于如何组合我已经设法完成的两个信号,但是当我使用while循环重复20秒以上的复合信号时,从声音输出获得的信号与我的预期并不完全相同。它听起来包含了所存储的复合信号的数组(0.8s的信号= 0.3s的slowInterp信号)。我已包含所有代码和功能。基本上,我需要在while循环中输出声音以与复合信号同步,例如:如果我有一个信号每隔1s重复一次,我希望在while循环中听到一声哔声,该哔声持续10s以产生10声哔声,等等。

最佳答案

很难确切说明您需要什么,但是可能对以较低速率采样的序列进行插值将对您的应用程序有效。

如果t1s是您从较慢序列开始的时间,t2s是您从较慢序列得到的时间,slow是您较慢序列的时间,请执行以下操作:

slowInterp = interp1(t2s, slow, t1s);

现在您将以更快的速度采样 slow序列。

这仅对显示时间序列有用。如果您要进行任何光谱分析,都会引入伪影,但这是更高级的主题。

在信号处理工具箱中使用 resample函数也可能很有用。

关于matlab - 如何在Matlab代码的一个音频 channel 上同时输出由两个具有不同时间段的信号组成的复合信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17369933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com