xref: /btstack/tool/sine_table_generator.py (revision 5c54401929043df982e040eba652f5fd7763ce15)
1#!/usr/bin/env python3
2import math
3import sys
4
5# 1HZ == 1 sine
6# sample rate at 44100Hz, sine at 441Hz -> 441 sines in 44100 samples -> 44100/441 samples/sine
7
8sine_array = '''
9// input signal: pre-computed int16 sine wave, {sine_sample_rate} Hz at {sine_frequency} Hz
10static const int16_t sine_int16[] = {{'''
11
12VALUES_PER_LINE = 10
13sine_sample_rate = 44100
14sine_frequency = 441
15
16if __name__ == "__main__":
17    usage = '''
18    Usage: ./sine_table_generator.py sine_frequency sine_sample_rate
19    '''
20
21    if (len(sys.argv) < 3):
22        print(usage)
23        sys.exit(1)
24
25    sine_frequency = int(sys.argv[1])
26    sine_sample_rate = int(sys.argv[2])
27
28    if sine_frequency <= 0:
29        print(usage)
30        sys.exit(1)
31
32    if sine_sample_rate <= 0:
33        print(usage)
34        sys.exit(1)
35
36    sine_num_samples = int(sine_sample_rate/sine_frequency)
37    print(type(sine_num_samples).__name__)
38    print(sine_array.format(sine_sample_rate=sine_sample_rate, sine_frequency=sine_frequency))
39    items = 0
40    for sample in range(0,sine_num_samples):
41        items = items + 1
42        angle = (sample * 360.0) / sine_num_samples
43        sine = math.sin(math.radians(angle))
44        rescaled = int(round(sine * 32767))
45        print ("%6d, " % rescaled, end=''),
46        if items == VALUES_PER_LINE:
47            items = 0
48            print("")
49
50    print( "};")
51