Металлический звук из сгенерированного звука с грехом ()

У меня есть следующий код, смесь разные источники так как я изучаю C ++ из C и PHP фона:

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

1

Решение

Я думаю, что проблема может быть:

unsigned long insin, insinb, factor;

Это целочисленные типы.

попробуйте изменить это на

float insin, insinb, factor;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]