Я просто приведу вам простой пример (для sine wave
), а затем вы сможете создавать другие типы волн, которые вам интересны. Необходимые входные параметры:
- частота дискретизации (например, 8000, 16000 и т. д.)
- амплитуда (фактические значения зависят от формата вывода, но лучше иметь значения в диапазоне 0-1 и преобразовывать их в любой формат, который вам нравится / нужен)
- частота (выражается как часть частоты дискретизации)
- продолжительность (в секундах)
Длина буфера для данных тона (выборок) определяется как tone duration
в секундах, умноженное на sampling rate
.
Фактический код для создания синусоиды может выглядеть примерно так:
//global variables
const float PI = 3.141593;
const unsigned samplingRate = 8000;
const float amp = 0.8;
float *GenerateTone(float frequency, unsigned duration, unsigned &bufferLen){
const float freq = frequency/samplingRate; //(e.g 440 / 8000 = 0,055)
bufferLen = samplingRate * duration;
float *buffer = new float[bufferLen]
for(int i = 0; i < bufferLen; i++ ){
buffer[i] = amp * sin(2 * PI*freq * ((float)i)/samplingRate);
}
return buffer;
}
Вы можете вызвать эту функцию как
unsigned len;
float *pTone = GenerateTone(440, 1, len);//len is an out parameter
...
delete [] pTone; //deallocatone memory when you no longer need it
В C ++ вы также можете использовать std::vector
для хранения образцов. Таким образом, вам не нужно беспокоиться о выделении / освобождении памяти.
std::vector<float> v; //make vector global
const float PI = 3.141593;
const unsigned samplingRate = 8000;
const float amp = 0.8;
void GenerateTone(float frequency, unsigned duration){
const amp = 0.8f;
const float freq = frequency/samplingRate;
const unsigned len = samplingRate * duration;
for(int i = 0; i < len; i++ )
v.push_back(amp * sin(2*PI*freq * ((float)i)/sampleRate));
}
Вы также можете передать амплитуду в качестве параметра, но в приведенных выше примерах амплитуда жестко запрограммирована. Также см. (https://en.wikipedia.org/wiki/Triangle_wave, https://en.wikipedia.org/wiki/Square_wave)
person
dsp_user
schedule
10.12.2017