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