【问题标题】:Why my window function isn't removing harmonics?为什么我的窗口函数没有消除谐波?
【发布时间】:2020-11-16 13:17:55
【问题描述】:

我一直致力于创建混合波信号。我的代码在 C++ 中:

服务器信号:

    void server_sineWave(BitDepth buffer[], double sin_freq, double beep_freq) {

    BitDepth amplitude = std::numeric_limits<BitDepth>::max() * 0.5;
    QWORD c = 0;
    double d = (samplerate / sin_freq);

    int initial = NUM_SAMPLES / 25;

    for (QWORD i = 0; i < NUM_SAMPLES; i += channels) {

        buffer[i] = amplitude * sin((2 * pi * sin_freq * i) / samplerate); // sin wave generated at "freq"

        if (i == initial) {
            for (QWORD j = 0; j < 480; j++) {
                double stream = amplitude * sin((2 * pi * sin_freq * i / samplerate));
                double beep = amplitude * sin((2 * pi * beep_freq * j / samplerate));
                double multiplier = .4 * (1 - cos(2 * pi * j / 480));

                buffer[i] = stream + (beep * multiplier);
                i++;
            }

            initial = i + 19200.0;
        }
    }
  }

客户信号:

    void client_sineWave(BitDepth buffer[], double sin_freq, double beep_freq) {

    BitDepth amplitude = std::numeric_limits<BitDepth>::max() * 0.5;
    QWORD c = 0;
    double d = (samplerate / sin_freq);

    int initial = NUM_SAMPLES / 25;

    for (QWORD i = 0; i < NUM_SAMPLES; i += channels) {

        buffer[i] = amplitude * sin(2 * pi * sin_freq * i / samplerate); // sin wave generated at "freq"

        if (i == initial) {
            for (QWORD j = 0; j < 480; j++) {
                double stream = amplitude * sin((2 * pi * sin_freq * i / samplerate));
                double beep = amplitude * sin((2 * pi * beep_freq * j / samplerate));
                double multiplier = .4 * (1 - cos(2 * pi * j / 480));

                buffer[i] = stream + (beep * multiplier);
//                buffer[i] += (beep * multiplier);
                i++;
            }

            initial = i + 19200.0;


            //(1000 + rand() % 10000)
            //double deg = 360.0 / d;
            //buffer[i] = buffer[i + (1 * (channels - 1))] = sin((c++ * deg) * pi / 180) * amplitude;
        }
    }
}

混合服务器和客户端信号:

    void mix(BitDepth buffer[], BitDepth server[], BitDepth client[], double duration_milliseconds) {

    QWORD num_samples = duration_milliseconds * (NUM_SAMPLES / 10000.0);

    double tmp = 0;

    QWORD size = NUM_SAMPLES + num_samples;

    BitDepth *server_delay = new BitDepth[size];
    BitDepth *client_delay = new BitDepth[size];

    for (QWORD i = 0; i < size; i++) {
        if (i < num_samples) {
            server_delay[i] = 0;
            client_delay[i + NUM_SAMPLES] = 0;

        }
        if (i > num_samples) {
            server_delay[i] = server[i - num_samples];
            client_delay[i - num_samples] = client[i - num_samples];
        }

    }

    for (QWORD i = 0; i < NUM_SAMPLES; i += channels) {

//        double multiplier = .5 * (1 - cos(2 * pi * i / NUM_SAMPLES-1));
//        double multiplier = (0.54 - 0.46 * cos(2.0 * M_PI * (double) i / (double) (NUM_SAMPLES - 1)));


//        server_delay[i] = multiplier * (server_delay[i]);
//        client_delay[i] = multiplier * (client_delay[i]);

        tmp = server_delay[i] + client_delay[i];

        if (tmp > 32767) {
            tmp = 32767;
        } else if (tmp < -32768) {
            tmp = -32768;
        }

        buffer[i] = tmp;


    }
}

我在上述代码中的频谱图结果:

现在,当我通过将值从 0.5 增加到 0.8 来更改幅度时,在以下行中:

BitDepth amplitude = std::numeric_limits<BitDepth>::max() * 0.5;

BitDepth amplitude = std::numeric_limits<BitDepth>::max() * 0.8;

我得到以下结果:

我是 DSP c++ 编程的新手,我真的不知道这个问题是什么以及如何解决这个问题? 请帮我解决这个问题。 谢谢。

【问题讨论】:

  • 您的波形正在削波(因为 0.8 + 0.8 > 1.0),这将产生大量谐波 - 查看调试器中的数据,您会在 +/- 32k 处看到很多平坦的峰值.
  • 感谢@PaulR,让我更改值并在此之后更新您..
  • 感谢@PaulR。现在解决了。非常感谢
  • 不客气 - 很高兴听到它已解决。

标签: c++ audio signal-processing spectrogram


【解决方案1】:

正如@PaulR 所建议的,削波会导致很多谐波。

您的波形正在削波(因为 0.8 + 0.8 > 1.0),这将产生大量谐波 - 查看调试器中的数据,您会看到很多 +/- 32k 的平坦峰值。

所以,在处理完这个限制之后。我的问题已解决。

非常感谢。

【讨论】:

    猜你喜欢
    • 2021-08-01
    • 2012-12-09
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2017-04-27
    相关资源
    最近更新 更多