2016-12-13 25 views
1

私は、振幅、持続時間、周波数の異なる13の波形を生成するMATLAB上のプログラムを作成しています。各波形は5回繰り返されます。つまり、合計で65回の試行があります。n行m列の行列の要素からn正弦波を作成するにはどうすればよいですか?

各試行の合計の長さ= 1.5 ms。サンプリング周波数= 4kHz。私は波が0.5ミリ秒で始まることを望みます。波が始まる前に、そのオフセットに続いて、振幅をゼロにしたい(すなわち、波の前後の「フラットライン」)。

65行の正弦波の周波数( 'hz')、振幅( 'a')、期間(ms)を表す65x3の行列を作成しました。各行は単一の波を表します。

この65x3マトリックスに含まれている情報を使用して、振幅 'a'、周波数 'hz'、および継続時間 'ms'の65の正弦波を生成します。具体的には、行列のn番目の行で指定されたパラメータ(hz、a、ms)を使用して各波を作成する必要があります。例えば。行1 = 100,150の場合...これは50ms持続する100Hzの正弦波(振幅= 1)を生成したいことを意味します。

私はこの問題を解決するためにforループを構築しようとしました。しかし、ループはいくつかのエラーを返すので、それらを解決する方法がわかりません。エラーが返されないポイントにコードを適用しました。しかし、私の最近の試みは、実際には各波の持続時間がベクトル 'ms'に記載されたものでなければならない場合、等しい持続時間の65波を生成すると思われる。

ここで私の最新の、初心者ですがまだ失敗した試みがあります:(試行は上記の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

+0

ループ内で 'trials_waves'を上書きしています。 – excaza

答えて

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

あなたはまだもう一枚、ゼロパディングあなたの信号のフロントエンドを持って、それを行うにはたくさんの方法があります、一つの方法は、信号私が説明してきた方法を構築することですシグナル配列の先頭に適切な数のゼロを連結します。あなたが立ち往生した場合は、新しい質問をしてください。がんばろう!

+0

こんにちはTrogdor。私はあなたに個人的なメッセージを送る選択肢を見つけることができませんでしたが、あなたの答えをありがとうと言いたいだけです。あなたは私を非常に助けてくれて、本当に感謝しています。私はコードを少し修正し、問題は解決しました。あなたの助けをもう一度ありがとう! -H – Hans

+0

@ハンス、あなたは非常に歓迎です。あなたが私の答えをアップヴォートし、受け入れられたと印を付けるなら、それは私が必要なすべての感謝です。 – Trogdor

関連する問題