我正在 MATLAB 上编写一个程序,该程序生成 13 个不同幅度、持续时间和频率的波形。每个波形重复 5 次,这意味着我总共有 65 次“试验”。
每次试验的总长度 = 1.5 毫秒。采样频率 = 4 kHz。我希望波从 0.5 毫秒开始。在波开始之前以及在其偏移之后,我希望振幅为零(即波之前和之后的“平线”)。
我创建了一个 65x3 矩阵,其中各列表示 65 个正弦波的频率 ('hz')、幅度 ('a') 和持续时间 (ms)。每行表示一个波。
我想使用这个 65x3 矩阵中包含的信息来生成 65 个振幅为“a”、频率为“hz”、持续时间为“ms”的正弦波。具体来说:每个波应使用矩阵第 n 行中指定的参数 (hz,a,ms) 创建。例如。如果第 1 行 = 100, 1, 50...这意味着我想生成持续 50 毫秒的 100 Hz 正弦波(振幅 = 1)。
我尝试构建一个for循环来解决这个问题。但是,循环返回许多错误,我不知道如何解决它们。我已将代码调整为不返回错误;然而,我最近的尝试似乎生成了 65 个持续时间相等的波,而实际上每个波的持续时间应该是矢量“ms”中规定的时间。
这是我最新的尝试,尽管是新手,但仍然不成功:(请注意,“试验”代表上面讨论的 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
制作正弦波
对于初学者来说,让我们制作一个具有可变速率、幅度和长度的正弦波。
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);
您还有一块,在信号的前端进行零填充,有很多方法可以做到这一点,一种方法是按照我描述的方式构建信号,然后在前面连接适当数量的零您的信号阵列。