3 줄거리. 당신이 아직도 관심이있는 경우에 대한 답변입니다.
이 두 가지 무료 매개 변수 (b
및 alpha
), 2 개 개의 방정식이 있습니다 주파수에 대한 현재의 모델은
freq(0) = b = startfreq
freq(dursec) = b*exp(-alpha*dursec) = endfreq
와
freq(t) = b*exp(-alpha*t)
것 같습니다. 첫 번째 방정식 인 b = startfreq
은 b
(매우)입니다. 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=0
및 t=dursec
에서
freq(t) = a + b*exp(-alpha*t)
요구 사항은 두 개의 방정식의
freq(0) = a + b = startfreq
freq(dursec) = a + b*exp(-alpha*dursec) = endfreq
있습니다,하지만 우리는 이제 세 개의 매개 변수가 있습니다 a
, b
및 alpha
을. 나는 a
및 b
를 결정하기 위해 두 개의 방정식을 사용하고, 무료 매개 변수로 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);
정말 고마워요! startfreq == endfreq를 허용하기 위해 변경해야 할 부분은 무엇입니까? –
나는'startfreq == endfreq'을 처리하기 위해 스크립트를 수정했습니다. –