用sin()产生的声音中的金属声音

旧金山存在

由于我是从C和PHP背景学习C ++的,所以我有以下代码,混合了不同的来源

int main() {
  const unsigned int sampleRate = 48000;
  // prepare a 6 seconds buffer and write it
  const unsigned long int size = sampleRate*6;
  float sample[size];
  unsigned long int i = 0;
  unsigned long insin, insinb, factor;

  // Multiply for 2*pi and divide by sampleRate to make the default period of 1s
  // So the freq can be stated in Hz
  factor = 2*3.141592;

  for (i; i<size; i++) {
    // Store the value of the sin wave
    insin = 440*float(i)*factor/float(sampleRate);
    insinb = 880*float(i)*factor/float(sampleRate);

    if (i > size/8)
      // Attempt to make it sound more instrument-like
      sample[i] = 0.7 * sin(insin) + 0.3 * sin(insinb);
    else
      sample[i] = 0.7 * sin(insinb) + 0.3 * sin(insin);

    // DEBUG
    if (i < 1000)
      printf("%f\n", sample[i]);
    }

  writeWAVData("sin.mp3", sample, size, sampleRate, 1);
  return 1;
  }

它创建.mp3文件。但是,它总是1秒长,并且具有真正的金属声音。从中// DEBUG,我检索到的值并不是真正的正弦值。一小部分:

0.637161
0.637161
0.637161
0.070853
0.070853
0.070853
0.070853
0.070853
0.070853
0.070853
0.070853
0.070853
-0.383386
-0.383386
-0.383386
-0.383386
-0.383386

我认为,金属声音可能来自sin()返回的值太像正方形的事实。为什么会这样呢?我可以让sin()返回“更好的质量”函数,还是我做其他固有的错误?如果您有兴趣,这里是代码的开头和其余部分:

#include <fstream>
#include <cmath>
#include <sndfile.hh>

template <typename T>
void write(std::ofstream& stream, const T& t) {
  stream.write((const char*)&t, sizeof(T));
  }

template <typename SampleType>
void writeWAVData(const char* outFile, SampleType* buf, size_t bufSize,
                  int sampleRate, short channels)
  {
  std::ofstream stream(outFile, std::ios::binary);
  stream.write("RIFF", 4);
  write<int>(stream, 36 + bufSize);
  stream.write("WAVE", 4);
  stream.write("fmt ", 4);
  write<int>(stream, 16);
  write<short>(stream, 1);                                        // Format (1 = PCM)
  write<short>(stream, channels);                                 // Channels
  write<int>(stream, sampleRate);                                 // Sample Rate
  write<int>(stream, sampleRate * channels * sizeof(SampleType)); // Byterate
  write<short>(stream, channels * sizeof(SampleType));            // Frame size
  write<short>(stream, 8 * sizeof(SampleType));                   // Bits per sample
  stream.write("data", 4);
  stream.write((const char*)&bufSize, 4);
  stream.write((const char*)buf, bufSize);
  }

我只是通过在Linux(Ubuntu 13.10)中执行此操作来编译它:

 g++ audio.cpp -o audio && ./audio
彼得·德里瓦兹

我认为问题可能是:

unsigned long insin, insinb, factor;

这些是整数类型。

尝试将其更改为

float insin, insinb, factor;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java声音生成产生嘈杂的声音

来自分类Dev

Java声音生成产生嘈杂的声音

来自分类Dev

MIDI Java产生混乱的声音

来自分类Dev

产生声音(不是来自文件)

来自分类Dev

iOS产生方形声音

来自分类Dev

程序不产生 Midi 声音

来自分类Dev

iOS 7中缺少系统“声音”声音

来自分类Dev

声音小程序中的Lubuntu声音设置

来自分类Dev

C ++中的简单声音

来自分类Dev

Swift中的“声音”识别?

来自分类Dev

python中的声音(conda)

来自分类Dev

用Java播放声音

来自分类Dev

用ALSA更换声音芯片

来自分类Dev

用 JavaScript 播放通知声音

来自分类Dev

如何对悬停产生声音效果

来自分类Dev

Python sounddevice在树莓派上不产生声音

来自分类Dev

在Swift中产生不同频率的声音

来自分类Dev

如何产生不同的声音频率?

来自分类Dev

使用C ++ / CLI时不会产生声音

来自分类Dev

如何从阵列产生声音信号?

来自分类Dev

JavaScript WebAudio产生多种频率的声音

来自分类Dev

#读取音频格式并产生声音

来自分类Dev

消除AS3中产生的声音中无用的咔嗒声

来自分类Dev

ubuntu 13.10中的音频卡在播放声音时会产生很多噪音

来自分类Dev

如何将文本产生的声音保存为mp3或python中的wave

来自分类Dev

如何在 Android 中以分贝而不是百分比的响度产生声音?

来自分类Dev

NSTableview reloadDataForRowIndexes在Mac中的声音

来自分类Dev

在Android中从内存加载声音

来自分类Dev

声音文件中的UnicodeDecodeError