2014-02-20 3 views
0

matlab/octave에서 스펙트로 그램을 만들 때 아래의 빨간색 줄거리처럼 보이는 스위프 신호를 생성 할 수 있습니다. 그러나 아래 방정식을 사용하여 1 차 플롯에서 파란색 선과 같은 스위프 신호를 어떻게 만들 수 있습니까? 지금까지 코드 나이를 얻기를위한 다니엘과 다윗스윕 신호 방정식

덕분에

startfreq=200; 
fs=44100; 
endfreq=20; 
dursec= 10;%duration of signal in seconds 
t=(0:dursec*fs)/fs; %Time vector 
alpha=log(startfreq/endfreq)/dursec; 
sig = exp(-j*2*pi*startfreq/alpha*exp(-alpha*t)); 
sig=(sig/max(abs(sig))*.8); %normalize signal 
wavwrite([sig'] ,fs,32,strcat('/tmp/del.wav')); %export file 
specgram(sig,150,400); 

1 플롯 아래 Plot that I'm trying to reproduce


2 플롯 Plot with 200hz-20hz works

입니다

변수 sig에있는 수식을 수정하여 첫 번째 플롯 인의 파란색 줄처럼 보이게하려면 어떻게해야합니까?

당신이 지금이 알아 낸 수 있도록이 질문은, 거의 한 달 오래된 Plot with 20hz-200hz which doesn't do what I want


답변

1

3 줄거리. 당신이 아직도 관심이있는 경우에 대한 답변입니다.

이 두 가지 무료 매개 변수 (balpha), 2 개 개의 방정식이 있습니다 주파수에 대한 현재의 모델은

freq(0) = b = startfreq 
freq(dursec) = b*exp(-alpha*dursec) = endfreq 

freq(t) = b*exp(-alpha*t) 

것 같습니다. 첫 번째 방정식 인 b = startfreqb (매우)입니다. alpha의 마지막 방정식을 해결

alpha = -log(endfreq/startfreq)/dursec 
     = log(startfreq/endfreq)/dursec 

그래서

freq(t) = startfreq * exp(-alpha*t) 

는 주파수 스위프 신호의 순간 주파수로 사용하기 위해 제공, 우리는 내가거야, 적분 필요 호출 단계 (t) :

phase(t) = -(startfreq/alpha) * exp(-alpha*t) 

equency 휩쓸 신호가 다음

sig(t) = exp(2*pi*j * phase(t)) 

이 신호의 실수 부 것은 현재의 코드를 설명

sig(t) = cos(2*pi*phase(t)) 

입니다. 파란색 곡선과 같이 주파수가 변하는 짹짹을 생성하려면 주파수에 대해 다른 모델이 필요합니다.위에서 사용 된 것보다 더 일반적인 모델은 t=0t=dursec에서

freq(t) = a + b*exp(-alpha*t) 

요구 사항은 두 개의 방정식의

freq(0) = a + b = startfreq 
freq(dursec) = a + b*exp(-alpha*dursec) = endfreq 

있습니다,하지만 우리는 이제 세 개의 매개 변수가 있습니다 a, balpha을. 나는 ab를 결정하기 위해 두 개의 방정식을 사용하고, 무료 매개 변수로 alpha을 떠날거야. 해결 모델 통합

b = (startfreq - endfreq)/(1 - exp(-alpha*dursec)) 
a = startfreq - b 

phase(t) = a*t - (b/alpha)*exp(-alpha*t) 

alpha는 임의의 파라미터 제공 준다. 첫 번째 모델의 수식에 따라 다음을 사용합니다.

alpha = abs(log(startfreq/endfreq))/dursec 

다음은 전체 스크립트입니다. 나는 또한 cos(2*pi*...)exp(-j*2*pi*...)의 사용을 변경합니다. 인수 0.8은 코드와 일치합니다.

startfreq = 20; 
endfreq = 200; 
fs = 44100; 
dursec = 10; % duration of signal in seconds 
t = (0:dursec*fs)/fs; % Time vector 

if (startfreq == endfreq) 
    phase = startfreq * t; 
else 
    alpha = abs(log(endfreq/startfreq))/dursec; 
    b = (startfreq - endfreq)/(1 - exp(-alpha*dursec)); 
    a = startfreq - b; 

    phase = a*t - (b/alpha)*exp(-alpha*t); 
endif 

sig = 0.8 * cos(2*pi*phase); 

wavwrite([sig'] ,fs,32,strcat('del.wav')); % export file 
specgram(sig,150,400); 
+0

정말 고마워요! startfreq == endfreq를 허용하기 위해 변경해야 할 부분은 무엇입니까? –

+1

나는'startfreq == endfreq'을 처리하기 위해 스크립트를 수정했습니다. –