問題描述
我正在編寫一個 c 程序來生成一個正弦波,該正弦波在給定的時間間隔內將頻率從 f1 緩慢上升到 f2.
I'm writing a c program to generate a sinusoidal wave that slowly ramps up frequency from f1 to f2 for a giving time interval.
我已經編寫了這個 c 程序來將頻率從 0 提升到 10 Hz,但問題是頻率在 360 度完成后會發生變化.如果我嘗試在 0 到 360 度之間更改頻率,則過渡不平滑且突然.
I have written this c program to ramp the frequency from 0 to 10 Hz but the problem is that the frequency changes after completion of 360 degrees. If I try to change the frequency between 0 and 360 degree that the transition is not smooth and it is abrupt.
這是我用過的正弦方程 y = Amplitude*sin(freq*phase)
This is the equation the sin that I have used y = Amplitude*sin(freq*phase)
int main(int argc, char *argv[]) {
double y, freq,phase;
int count; // for convenience of plotting in matlab so all the waves are spread on x axis.
for (freq = 0; freq < 10; freq+=1) {
for (phase = 0; phase < 360; phase++) { // phase is 360 degrees
y = 3 * sin((count*6.283185)+(freq*(phase*(3.14159/180))));
printf("%f %f %f
", freq, phase, y);
}
count++;
}
return EXIT_SUCCESS;
}
- 如何在給定的時間段內平穩地改變頻率?
- 我應該研究傅立葉變換嗎?
推薦答案
如果您希望角頻率 (w=2 p f) 隨時間線性變化,則 dw/dt = a
和 w = w0 + (wn-w0)*t/tn
(其中 t
從 0 到 tn
,w
去從 w0
到 wn
).相位是它的積分,所以 phase = w0 t + (wn-w0)*t^2/(2tn)
(正如 oli 所說):
if you want angular frequency (w=2 pi f) to vary linearly with time then dw/dt = a
and w = w0 + (wn-w0)*t/tn
(where t
goes from 0 to tn
, w
goes from w0
to wn
). phase is the integral of that, so phase = w0 t + (wn-w0)*t^2/(2tn)
(as oli says):
void sweep(double f_start, double f_end, double interval, int n_steps) {
for (int i = 0; i < n_steps; ++i) {
double delta = i / (float)n_steps;
double t = interval * delta;
double phase = 2 * PI * t * (f_start + (f_end - f_start) * delta / 2);
while (phase > 2 * PI) phase -= 2 * PI; // optional
printf("%f %f %f", t, phase * 180 / PI, 3 * sin(phase));
}
}
(其中間隔為 tn,增量為 t/tn).
(where interval is tn and delta is t/tn).
這是等效 python 代碼的輸出(5 秒內 1-10Hz):
here's the output for the equivalent python code (1-10Hz over 5 seconds):
from math import pi, sin
def sweep(f_start, f_end, interval, n_steps):
for i in range(n_steps):
delta = i / float(n_steps)
t = interval * delta
phase = 2 * pi * t * (f_start + (f_end - f_start) * delta / 2)
print t, phase * 180 / pi, 3 * sin(phase)
sweep(1, 10, 5, 1000)
順便說一句,如果你正在聽這個(或看著它 - 任何涉及人類感知的東西),我懷疑你不想要線性增長,而是指數增長.但那是 一個不同的問題...
ps incidentally, if you're listening to this (or looking at it - anything that involves human perception) i suspect you don't want a linear increase, but an exponential one. but that's a different question...
這篇關于在給定時間內將頻率從 f1 緩慢上升到 f2 的正弦波的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!