调整扫频信号方程

时间:2014-02-20 02:35:55

标签: matlab signal-processing octave

当我用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);

第一个情节 Plot that I'm trying to reproduce


第二个情节 Plot with 200hz-20hz works


如何修正变量 sig 中的等式,使其看起来像 1st plot 中的蓝线?

第3个剧情 Plot with 20hz-200hz which doesn't do what I want


1 个答案:

答案 0 :(得分:1)

这个问题差不多有一个月了,所以你现在可能已经想到了这个问题。如果您仍然感兴趣,可以在这里找到答案。

您的当前频率模型似乎是

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

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

有两个自由参数(balpha)和两个方程式。第一个等式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=0t=dursec的要求为

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

这是两个等式,但我们现在有三个参数:abalpha。我将使用这两个等式来确定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

以下是完整的脚本。请注意,我还将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);