2016-12-13 15 views
1

다양한 진폭, 지속 시간 및 빈도의 13 개의 파형을 생성하는 MATLAB 프로그램을 작성하고 있습니다. 각 파형은 5 번 반복됩니다. 즉 총 65 회의 '시행'이 있습니다.n-by-m 행렬의 요소로부터 n 개의 사인파를 생성하려면 어떻게해야합니까?

각 시험의 총 길이 = 1.5ms. 샘플링 주파수 = 4 kHz. 웨이브를 0.5ms에서 시작하겠습니다. 웨이브가 시작되기 전에 오프셋을 따라 진폭을 0으로하고 싶습니다 (즉, 웨이브 이전 및 이후의 '플랫 라인').

65 개의 사인파의 빈도 ('hz'), 진폭 (a ') 및 지속 시간 (ms)을 나타내는 65x3 매트릭스를 만들었습니다. 각 행은 단일 웨이브를 나타냅니다.

진폭 'a', 주파수 'hz'및 지속 시간 'ms'의 65 개의 사인파를 생성하려면이 65x3 매트릭스에 포함 된 정보를 사용하고 싶습니다. 구체적으로 : 각 웨이브는 행렬의 n 번째 행에 지정된 매개 변수 (hz, a, ms)를 사용하여 만들어야합니다. 예 : 1 행 = 100, 1, 50이면 ... 100Hz의 사인파 (진폭 = 1)를 50ms 지속되도록 생성하고 싶습니다.

나는이 문제를 해결하기 위해 for 루프를 만들려고했다. 그러나 루프는 여러 가지 오류를 반환하며 해결 방법을 모르겠습니다. 오류가 반환되지 않는 지점에 코드를 적용했습니다. 그러나, 나의 최근의 시도는 사실상 각 파동의 지속 시간이 벡터 'ms'에 명시된 것과 같아야한다는 동일한 지속 시간의 65 파를 생성하는 것으로 보인다.

초심자이지만 아직 실패한 시도입니다. ('trial'은 위에 설명 된 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); 

참고! 이것은 전체 파장에 대해 간신히 충분한 시간이기 때문에 느린 속도와 짧은 시간에주의하십시오.

루프에이를 켜려면

하는 여러 사인 파도, I는 입력 변수의 벡터로 인덱스가 필요합니다. 내 앞의 예를 사용하여 :

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을 연결하십시오. 막히면 새로운 질문을하십시오. 행운을 빕니다!

+0

안녕하세요. Trogdor. 나는 당신에게 개인적인 메시지를 보낼 수있는 옵션을 찾을 수 없었지만, 당신의 대답에 대해 당신에게 감사의 말을 전하고 싶습니다. 당신은 나를 대단히 도와 주었고 정말로 감사드립니다. 코드를 약간 수정했는데 문제가 해결되었습니다. 도와 주셔서 다시 한 번 감사드립니다! -H – Hans

+0

@ 한스, 당신은 대단히 환영합니다. 내 대답을 upvote하고 받아 들일 수 있다면 그것은 필요한 모든 감사의 :) – Trogdor

관련 문제