-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathfm.cpp
More file actions
40 lines (30 loc) · 1.14 KB
/
fm.cpp
File metadata and controls
40 lines (30 loc) · 1.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <cmath>
#include <cstdint>
#include <fstream>
#include <vector>
const double PI = 3.1415926535897;
int main()
{
const int message_sample_rate = 44100;
const double carrier_freq = 100e3;
const double sample_rate = 16 * carrier_freq;
const double modulation_index = 0.5;
double modulation_integral = 0;
std::ofstream out("/tmp/fm.raw");
std::ifstream in("/tmp/test.raw");
std::vector<double> in_v;
while (!in.eof()) {
int16_t input_sample;
in.read(reinterpret_cast<char*>(&input_sample), sizeof(int16_t));
in_v.push_back(static_cast<double>(input_sample) / INT16_MAX);
}
for (size_t i = 0; i < in_v.size() * sample_rate / message_sample_rate; i++) {
const double t = (double)i / sample_rate;
const double modulation = in_v[i * message_sample_rate / sample_rate];
modulation_integral += modulation * modulation_index / sample_rate;
const double fm = ::cos(2 * PI * carrier_freq * (t + modulation_integral));
const int16_t fm_s16 = fm * INT16_MAX;
out.write(reinterpret_cast<const char*>(&fm_s16), sizeof(fm_s16));
}
return 0;
}