当我用matlab / octave进行频谱图时,我可以创建一个看起来像下面的RED曲线的扫频信号。但是如何使用下面的等式在第一个图中创建像BLUE一样的扫描信号。
感谢Daniel和David让我这么远,代码在下面
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);
第一个情节
第二个情节
如何修正变量 sig 中的等式,使其看起来像 1st plot 中的蓝线?
第3个剧情
答案 0 :(得分:1)
这个问题差不多有一个月了,所以你现在可能已经想到了这个问题。如果您仍然感兴趣,可以在这里找到答案。
您的当前频率模型似乎是
freq(t) = b*exp(-alpha*t)
与
freq(0) = b = startfreq
freq(dursec) = b*exp(-alpha*dursec) = endfreq
有两个自由参数(b
和alpha
)和两个方程式。第一个等式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)
然后(复数)频率扫描信号
sig(t) = exp(2*pi*j * phase(t))
此信号的真实部分是
sig(t) = cos(2*pi*phase(t))
这解释了您当前的代码。要生成频率与蓝色曲线不同的啁啾,您需要一个不同的频率模型。比上面使用的更通用的模型是
freq(t) = a + b*exp(-alpha*t)
t=0
和t=dursec
的要求为
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
以下是完整的脚本。请注意,我还将exp(-j*2*pi*...)
的使用更改为cos(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);