如何从 n×m 矩阵的元素创建 n 个正弦波?
How can I create n sine waves from the elements of an n-by-m matrix?
我正在 MATLAB 上编写程序,生成 13 个不同幅度、持续时间和频率的波形。每个波形重复5次,也就是说我总共有65个'trials'
每次试验的总时长 = 1.5 毫秒。采样频率 = 4 kHz。我希望波从 0.5 毫秒开始。在波浪开始之前,并在其偏移之后,我希望振幅为零(即波浪之前和之后的 'flatline')。
我创建了一个 65x3 矩阵,其中列表示 65 个正弦波的频率 ('hz')、幅度 ('a') 和持续时间 (ms)。每行表示一个波。
我想使用这个 65x3 矩阵中包含的信息生成 65 个振幅 'a'、频率 'hz' 和持续时间 'ms' 的正弦波。具体而言:应使用矩阵第 n 行中指定的参数 (hz,a,ms) 创建每个波。例如。如果第 1 行 = 100、1、50... 这意味着我想生成持续 50 毫秒的 100 Hz 正弦波(振幅 = 1)。
我试图构造一个for循环来解决这个问题。然而,循环 returns 出现了一些错误,我不知道如何解决它们。我已将代码调整到不返回任何错误的程度;然而,我最近的尝试似乎产生了 65 个持续时间相等的波,而实际上每个波的持续时间应该是矢量 'ms'.
中规定的时间
这是我最新的尝试,虽然是新手,但仍然不成功:(请注意,'trials' 代表上面讨论的 65x3 矩阵;mA = 振幅)。
hz=trials(:,1); mA=trials(:,2); ms=trials(:,3);
trials_waves=zeros(65,500); % the max duration (= 500ms); unsure of this part?
for n = 1:size(order,1)
trials_waves = mA*sin(2*pi*hz*0:ms);
end
如果所提供的信息不足,我们深表歉意。这是我第一次在这个网站上提问。如果需要,我可以提供更多信息。
感谢您的帮助。
最好的,
H
看起来你的开端不错,我会尽力帮助你进一步实现你的解决方案。
制作正弦波
首先,让我们制作一个具有可变速率、幅度和长度的正弦波。
Fs = 4e3; % sample rate of 4 kHz
Sr = 100; % example rate
Sa = 1; % amplitude
St = 10e-3; % signal duration is 10 ms
% To create a sine wave in MATLAB, I'm going to first create a vector of time,
% `t`, and then create the vector of sine wave samples.
N = St * Fs; % number of samples = duration times sample rate;
t = (1:N) * 1/Fs; % time increment is one over sample rate
% Now I can build my sine wave:
Wave = Sa * sin( 2 * pi * Sr * t );
figure; plot(t, Wave);
注意!对于全波长来说,这几乎是不够的时间,所以要小心低速率和短时间长度。
制作多个正弦波
要将其变成一个循环,我需要对输入变量的向量进行索引。使用我之前的例子:
Fs = 4e3; % sample rate of 4 kHz
Sr = [100 200 300]; % rates
Sa = [1 .8 .5]; % amplitudes
St = [10e-3 20e-3 25e-3]; % signal durations
nWaves = length(Sr);
N = max(St) * Fs; % number of samples = duration times sample rate;
t = (1:N) /Fs; % time increment is one over sample rate
% initialize the array
waves = zeros(nWaves, N);
for iWaves = 1:nWaves
% index into each variable
thisT = (1:St(iWaves) * Fs) * 1/Fs;
myWave = Sa(iWaves) * sin( 2 * pi * Sr(iWaves) * thisT );
waves(iWaves,1:length(myWave)) = myWave;
end
figure; plot(t, waves);
你还有一点,用零填充你的信号的前端,有很多方法可以做到这一点,一种方法是按照我描述的方式构建信号,然后连接适当数量的零到信号阵列的前面。如果您遇到困难,请随时提出新问题。祝你好运!
我正在 MATLAB 上编写程序,生成 13 个不同幅度、持续时间和频率的波形。每个波形重复5次,也就是说我总共有65个'trials'
每次试验的总时长 = 1.5 毫秒。采样频率 = 4 kHz。我希望波从 0.5 毫秒开始。在波浪开始之前,并在其偏移之后,我希望振幅为零(即波浪之前和之后的 'flatline')。
我创建了一个 65x3 矩阵,其中列表示 65 个正弦波的频率 ('hz')、幅度 ('a') 和持续时间 (ms)。每行表示一个波。
我想使用这个 65x3 矩阵中包含的信息生成 65 个振幅 'a'、频率 'hz' 和持续时间 'ms' 的正弦波。具体而言:应使用矩阵第 n 行中指定的参数 (hz,a,ms) 创建每个波。例如。如果第 1 行 = 100、1、50... 这意味着我想生成持续 50 毫秒的 100 Hz 正弦波(振幅 = 1)。
我试图构造一个for循环来解决这个问题。然而,循环 returns 出现了一些错误,我不知道如何解决它们。我已将代码调整到不返回任何错误的程度;然而,我最近的尝试似乎产生了 65 个持续时间相等的波,而实际上每个波的持续时间应该是矢量 'ms'.
中规定的时间这是我最新的尝试,虽然是新手,但仍然不成功:(请注意,'trials' 代表上面讨论的 65x3 矩阵;mA = 振幅)。
hz=trials(:,1); mA=trials(:,2); ms=trials(:,3);
trials_waves=zeros(65,500); % the max duration (= 500ms); unsure of this part?
for n = 1:size(order,1)
trials_waves = mA*sin(2*pi*hz*0:ms);
end
如果所提供的信息不足,我们深表歉意。这是我第一次在这个网站上提问。如果需要,我可以提供更多信息。
感谢您的帮助。
最好的, H
看起来你的开端不错,我会尽力帮助你进一步实现你的解决方案。
制作正弦波
首先,让我们制作一个具有可变速率、幅度和长度的正弦波。
Fs = 4e3; % sample rate of 4 kHz
Sr = 100; % example rate
Sa = 1; % amplitude
St = 10e-3; % signal duration is 10 ms
% To create a sine wave in MATLAB, I'm going to first create a vector of time,
% `t`, and then create the vector of sine wave samples.
N = St * Fs; % number of samples = duration times sample rate;
t = (1:N) * 1/Fs; % time increment is one over sample rate
% Now I can build my sine wave:
Wave = Sa * sin( 2 * pi * Sr * t );
figure; plot(t, Wave);
注意!对于全波长来说,这几乎是不够的时间,所以要小心低速率和短时间长度。
制作多个正弦波
要将其变成一个循环,我需要对输入变量的向量进行索引。使用我之前的例子:
Fs = 4e3; % sample rate of 4 kHz
Sr = [100 200 300]; % rates
Sa = [1 .8 .5]; % amplitudes
St = [10e-3 20e-3 25e-3]; % signal durations
nWaves = length(Sr);
N = max(St) * Fs; % number of samples = duration times sample rate;
t = (1:N) /Fs; % time increment is one over sample rate
% initialize the array
waves = zeros(nWaves, N);
for iWaves = 1:nWaves
% index into each variable
thisT = (1:St(iWaves) * Fs) * 1/Fs;
myWave = Sa(iWaves) * sin( 2 * pi * Sr(iWaves) * thisT );
waves(iWaves,1:length(myWave)) = myWave;
end
figure; plot(t, waves);
你还有一点,用零填充你的信号的前端,有很多方法可以做到这一点,一种方法是按照我描述的方式构建信号,然后连接适当数量的零到信号阵列的前面。如果您遇到困难,请随时提出新问题。祝你好运!