当前位置: 首页 > 知识库问答 >
问题:

生成扫描正弦波

微生宝
2023-03-14

我如何建立一个方程来产生扫频正弦波。我是信号处理新手,在网上找不到太多关于生成扫描正弦波的话题。请告诉我一些我可以用来生成方程式并在代码中使用的源代码。非常感谢。

共有2个答案

益明朗
2023-03-14

使用gcc文件编译。c-lm-o文件

该程序生成单声道16位“扫描”正弦波。作为奖励,它还显示了广泛的振幅。

// http://www.purplemath.com/modules/grphtrig.htm

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdarg.h>
#include <string.h>

const double 
    radians = (M_PI * 2);

typedef struct SineWave {

double
    rate,           // sample rate
    frequency,      // oscillation Hz.
    amplitude,      // amplitude
    phase,          // current phase
    phaseStep;      // phase step

    struct transition {

        double
            amplitude,
            amplitudeStep,
            frequency,
            frequencyStep;

    } transition;

} SineWave;

SineWave * sine_wave(double frequency, double amplitude, double rate) {
    SineWave * sw = calloc(1, sizeof(SineWave));
    sw->frequency = frequency, sw->amplitude = amplitude, sw->rate = rate;
    return sw;
}

// close enough comparison..
// http://stackoverflow.com/a/18975072
int double_equals(double a, double b)
{
    return abs(a - b) < 0.001;
}

double sine_wave_sample(SineWave * sw) {
    double sample = sw->amplitude * sin(sw->phase);
    sw->phase += sw->phaseStep;
    if (sw->transition.frequencyStep) {
        sw->frequency += sw->transition.frequencyStep;
        sw->phaseStep = radians * sw->frequency / sw->rate;
        if (double_equals(sw->frequency, sw->transition.frequency)){
            sw->transition.frequencyStep = 0;
            sw->frequency = sw->transition.frequency;
        }
    }
    if (sw->transition.amplitudeStep) {
        sw->amplitude += sw->transition.amplitudeStep;
        if (double_equals(sw->amplitude, sw->transition.amplitude)) {
            sw->transition.amplitudeStep = 0;
            sw->amplitude = sw->transition.amplitude;
        }
    }
    return sample;
}

void sine_wave_frequency_transition(SineWave * sw, double frequency, double duration) {
    sw->transition.frequency = frequency;
    sw->transition.frequencyStep = (frequency - sw->frequency) / (sw->rate * duration);
}

void sine_wave_amplitude_transition(SineWave * sw, double amplitude, double duration) {
    sw->transition.amplitude = amplitude;
    sw->transition.amplitudeStep = (amplitude - sw->amplitude) / (sw->rate * duration);
}

// test
int main(int argc, char ** argv) {

    SineWave * mono = sine_wave(0, 0, 44100); // start with "nothing"

    // transition to 500 Hz by .5 seconds.
    sine_wave_frequency_transition(mono, 500, .5);

    // transition to 50% amplitude by 1 second
    sine_wave_amplitude_transition(mono, SHRT_MAX * .5, 1);

    // 1 second of samples total
    long long samples = mono->rate * 1;

    short sample;
    while (samples--) {
        sample = sine_wave_sample(mono);
        fwrite(&sample, sizeof(sample), 1, stdout);
    }

    return 0;
}
傅经业
2023-03-14

最简单的方法是使用相位累加器——这是一种简单的方法,它可以确保频率变化时的相位连续性。

要生成固定频率的正弦波,您可以这样做(伪代码):

//
// A = sine wave amplitude
// fs = sample rate (Hz)
// f = sine wave frequency (Hz)
//
phi = 0;                      // phase accumulator
delta = 2 * pi * f / Fs;      // phase increment per sample
for each sample
    output = A * sin(phi);    // output sample value for current sample
    phi += delta;             // increment phase accumulator

对于扫频正弦波,频率将线性上升,即线性上升delta

//
// A = sine wave amplitude
// fs = sample rate (Hz)
// f0 = initial frequency (Hz)
// f1 = final frequency (Hz)
// T_sweep = duration of sweep (s)
//
phi = 0;                      // phase accumulator
f = f0;                       // initial frequency
delta = 2 * pi * f / Fs;      // phase increment per sample
f_delta = (f1 - f0) / (Fs * T_sweep);
                              // instantaneous frequency increment per sample
for each sample
    output = A * sin(phi);    // output sample value for current sample
    phi += delta;             // increment phase accumulator
    f += f_delta;             // increment instantaneous frequency
    delta = 2 * pi * f / Fs;  // re-calculate phase increment
 类似资料:
  • 我试图生成一组点,当绘制成一个图表示1个周期的正弦波。要求是: 1个周期的正弦波 下限=29491 上限=36043 点数=100 振幅=3276 零偏移量=32767 代码: 我正在生成并存储一个文件中的点。当这些点被绘制出来时,我得到了下面的图。 但我只需要一个循环。我怎么能这么做?

  • 在 ZBarSDK(本站下载:http://code4app.com/ios/ZBar-Barcode-Reader/4fa23f3f06f6e7ee18000000)的基础上做的一个demo,能够将字符串转换成二维码,能够通过摄像头扫描二维码。代码里面有对如何使用 ZBarSDK 的详细说明。 [Code4App.com]

  • 利用ZXing类库实现二维码生成和扫描识别的功能。可以生成不同颜色的二维码,以及圆点和矩形点形状的二维码。 二维码扫描功能,能识别本地相册的二维码。由于作者没有做屏幕适配,所以二维码生成的功能只能在4.0inch屏幕进行测试。 [Code4App.com]

  • 问题内容: 在Java中以任何频率生成正弦波声音的最简单方法是什么?样本大小大于2个字节会有所帮助,但这并不 重要。 问题答案: 见一个自包含的例子。 也许更简单? 如链接答案顶部所示,这51行代码段(在下面重复-分隔为单行和行内注释)大约与 生成音调一样简单(好的,您可以取出5行以上用于谐波)。 人们似乎认为这应该是工具包中内置的一种产生 纯净音调的方法。并非如此,要花一点时间就可以做到。

  • 用C/C++编写了一个三维正弦波发生器 代码:

  • 本文向大家介绍iOS二维码的生成和扫描,包括了iOS二维码的生成和扫描的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 属性 二维码的生成  * createNonInterpolatedUIImageFormCIImage:outputImage方法的实现  二维码的扫描  *扫描到结果后会调用的方法 以上就是本文的全