gpt4 book ai didi

c++ - 在给定时间内将频率从f1缓慢升高到f2的正弦波

转载 作者:行者123 更新时间:2023-12-03 02:19:47 24 4
gpt4 key购买 nike

我正在编写一个c程序来生成一个正弦波,该波在给定的时间间隔内将频率从f1缓慢提升到f2。

我已经编写了这个c程序,将频率从0斜升到10 Hz,但是问题是频率在360度完成后会发生变化。如果尝试在0到360度之间更改频率,则过渡会变得不平稳且会突然发生。

这是方程式,我用过的罪过y =幅值* sin(频率*相位)

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 \n", freq, phase, y);
}
count++;
}
return EXIT_SUCCESS;
}
  • 如何在给定的时间内平稳地更改频率?
  • 我应该研究傅里叶变换吗?
  • 最佳答案

    如果您希望角频率(w = 2 pi f)随时间线性变化,则dw/dt = aw = w0 + (wn-w0)*t/tn(其中t从0变为tnww0变为wn)。阶段是其不可或缺的一部分,因此phase = w0 t + (wn-w0)*t^2/(2tn)(如oli所说):

    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)。

    这是等效的python代码的输出(5秒内为1-10Hz):
    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顺便说一句,如果您正在听(或看着它-涉及人类感知的任何事物),我怀疑您不希望线性增加,而希望呈指数增加。但这是 a different question ...

    关于c++ - 在给定时间内将频率从f1缓慢升高到f2的正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15179972/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com