在Matlab中生成可变频率正弦波

时间:2014-04-13 02:36:45

标签: matlab frequency sine

标题说的一切都很简单,但我遇到了困难。

我想创建一个正弦波,它以我输入的功率以指数方式衰减。我尝试了很多不同的东西,或者我得到了胡言乱语,或者我认为它被称为声学节拍?

Gibberish例子

在此示例中,阵列乘数从1到4。当我绘制cos(70000000 * t)和cos(4 * 70000000 * t)时,两个图看起来都很好,但下面代码中的图只是看起来像噪声。

t = 1:.0000000004:1.0000004;
multiplier = linspace(1,2,1001).^-2;
reference_signal = cos(700000000*t.*multiplier);
plot(reference_signal)

击败示例http://imgur.com/E9HPLy8

t = 1:.0000000004:1.0000004;
mult = linspace(1,3,1001);
plot(cos(700000000*t.*mult));

有没有人想过如何创建一个代表正弦波频率呈指数衰减的正弦波阵列?

非常感谢

4 个答案:

答案 0 :(得分:2)

我认为您的问题是采样问题 - 您的采样频率对于您尝试表示的信号来说太低了。

我建议您通过显式计算进行调试

freq = 7E8/(2*pi);
t = 1 + linspace(0, 4E-7, 1001);
multiplier = linspace(1,2,1001).^2;
omega_t = 2*pi*freq*t.*multiplier;
d_omega_t = diff(omega_t);
plot(d_omega_t);

如果d_omega_t大于pi,你知道你有一个混叠问题 - 每个周期至少需要两个点来忠实再现一个波形(奈奎斯特定理)。这可以通过使用更高的采样频率(更多点)或更低的频率来解决。

实际上,你的乘数1和4看起来还不错,因为正在进行的混叠是不变的 - 所以你不会注意到这是一个问题。

<强>更新

我只是在时间变量中使用和不使用+1运行上面的内容 - 这会产生很大的不同。两个相邻值之间的差值为

2*pi*freq*(1 + t(n) - t(n-1)) * (mult(n) - mult(n-1))
2*pi*freq*(mult(n) - mult(n-1) + (t(n)-t(n-1)) * (mult(n)-mult(n-1))

这是一个非常大的值,因为2 * pi freq (multi(n)-mult(n-1))是一个非常大的值。

当您遗漏+1并执行

t = linspace(0, 4E-7, 1001);
multiplier = linspace(1,2,1001).^-2;
事情表现得像预期的那样 - 情节最终看起来像:

enter image description here

答案 1 :(得分:2)

t = 0:0.0001:2*pi;
l = linspace(1,4,numel(t)).^2;
s = sin(t.*l);
figure,plot(t,fliplr(s)),axis tight

制作情节:

enter image description here

答案 2 :(得分:1)

要计算可变频率的信号,必须保持相位角,因此最好执行以下操作:

a [n + 1] = a [n] + 2 * pi * f(t)

其中a是样本n处的正弦波相位,f(t)是您更改频率的频率。然后可以轻松生成正弦波:sin(a)

在2秒钟内频率从1 Hz变为4 Hz的matlab代码:

Ts = 0.0001;
t = 0:Ts:2;
f = linspace(1, 4, length(t));
d_a = 2 * pi * f * Ts;
a = cumsum(d_a) % + initial angle if you like
res = sin(a);
plot(t, res)

答案 3 :(得分:1)

在这里找到合适的答案:

https://www.mathworks.com/matlabcentral/answers/217746-implementing-a-sine-wave-with-linearly-changing-frequency?s_tid=mwa_osa_a

”公式:

 sin( 2*pi*f(t)*t )

不会产生具有时变频率的所需正弦波。相反,适当的公式将使用f(t)的0和t之间的积分代替f(t)* t:

 sin( 2*pi* ∫f(t)dt ) 

仅当f(t)为常数f值时,其积分为f * t,而正弦波为熟悉的sin(2 * pi f t)。

这样做的合理性是正弦频率是正弦相位的变化率/导数。如果给定了所需的频率曲线f(t),则需要对其进行积分以计算所需的正弦波相位(直到一个恒定的加法项),然后才能从中计算所需的波形。

(...)

在构建调频信号时,使用sin(2 * pi * f(t)* t)代替sin(2 * pi *∫f(t)dt)并不是一个普遍的错误。当f(t)是多项式函数时,前者会导致“几乎正确看似”的解决方案,这一事实使情况更加恶化。改用非多项式函数(例如f(t)= 2 + sin(t),一种在1Hz和3Hz之间振荡的调频音),可以更清楚地看到这两种方法之间的差异。”

(阿方索·涅托·卡斯塔农)

当我试图创建一个线性增加的频率正弦函数时,这为我解决了这个问题,为一个可变变频器(V / F控制)的上升斜坡建模,并在最后获得了两倍的频率。坡道。

我正在使用此功能

 V(ctrl)*V(pk)*cos(v(w_ctrl)*time + 0*3.14159/180); (i)

其中:

 v(w_ctrl) = 377 * V(ctrl); (ii)

 V(pk) = 180; (iii)

 V(ctrl) = 1*time; for time = 0...1 and V(ctrl) = 1; for time > 1 (iv)

以便公式(i)简化为:

 V(ctrl)*180*cos(377*time^2 + 0*3.14159/180); for time = 0...1 (v)

,结果可以在图1中看到。

然后,我使用了函数v(w_ctrl)的积分,而没有'time'变量:

 V(ctrl)*V(pk)*cos(v(int_w_ctrl) + 0*3.14159/180); (vi)

实际上是功能

 V(ctrl)*V(pk)*cos( (377*time^2)/2 + 0*3.14159/180); for time = 0...1 (vii)

这将导致适当的结果,如图2所示。

我使用的程序是Multisim 14,电路如图3所示。

Variable frequency up ramp - without integral

Variable frequency up ramp - with integral

Simulation Circuit