如何从n-by-m矩阵的元素创建n个正弦波?

时间:2016-12-13 13:26:16

标签: matlab for-loop sine neuroscience

我在MATLAB上编写一个程序,生成13个不同幅度,持续时间和频率的波形。每个波形重复5次,这意味着我有65次试验'总的来说。

每次试验的总长度= 1.5毫秒。采样频率= 4 kHz。我希望波在0.5毫秒开始。在波浪开始之前,并且在它的偏移之后,我希望振幅为零(即在波浪之前和之后的'平坦线条)。

我创建了一个65x3矩阵,其中列表示65个正弦波的频率(' hz'),幅度(' a')和持续时间(ms)。每行代表一个波浪。

我想使用此65x3矩阵中包含的信息来生成65个正弦波振幅' a'频率' hz'以及持续时间' ms&#39 ;。具体来说:应使用矩阵第n行中指定的参数(hz,a,ms)创建每个波形。例如。如果第1行= 100,1,50 ...这意味着我想生成一个持续50 ms的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

如果提供的信息稀缺,请道歉。这是我第一次在本网站上提问。如果需要,我可以提供更多信息。

感谢您的帮助。

最佳, ħ

1 个答案:

答案 0 :(得分:1)

看起来你有一个良好的开端,我会尽力帮助你进一步解决问题。

制作正弦波

首先,让我们制作一个速率,幅度和长度可变的正弦波。

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); 

你还有一个部分,信号的前端零填充,有很多方法可以做到这一点,一种方法是按照我描述的方式构建信号,然后将适当数量的零连接到信号阵列的正面。如果你遇到问题,请随意提出一个新问题。祝你好运!