xref: /btstack/tool/sine_table_generator.py (revision 5c54401929043df982e040eba652f5fd7763ce15)
1*5c544019SMatthias Ringwald#!/usr/bin/env python3
21c326df3SMilanka Ringwaldimport math
31c326df3SMilanka Ringwaldimport sys
41c326df3SMilanka Ringwald
51c326df3SMilanka Ringwald# 1HZ == 1 sine
61c326df3SMilanka Ringwald# sample rate at 44100Hz, sine at 441Hz -> 441 sines in 44100 samples -> 44100/441 samples/sine
71c326df3SMilanka Ringwald
81c326df3SMilanka Ringwaldsine_array = '''
91c326df3SMilanka Ringwald// input signal: pre-computed int16 sine wave, {sine_sample_rate} Hz at {sine_frequency} Hz
101c326df3SMilanka Ringwaldstatic const int16_t sine_int16[] = {{'''
111c326df3SMilanka Ringwald
121c326df3SMilanka RingwaldVALUES_PER_LINE = 10
131c326df3SMilanka Ringwaldsine_sample_rate = 44100
141c326df3SMilanka Ringwaldsine_frequency = 441
151c326df3SMilanka Ringwald
161c326df3SMilanka Ringwaldif __name__ == "__main__":
171c326df3SMilanka Ringwald    usage = '''
18293fd5fbSMilanka Ringwald    Usage: ./sine_table_generator.py sine_frequency sine_sample_rate
191c326df3SMilanka Ringwald    '''
201c326df3SMilanka Ringwald
211c326df3SMilanka Ringwald    if (len(sys.argv) < 3):
221c326df3SMilanka Ringwald        print(usage)
231c326df3SMilanka Ringwald        sys.exit(1)
241c326df3SMilanka Ringwald
251c326df3SMilanka Ringwald    sine_frequency = int(sys.argv[1])
261c326df3SMilanka Ringwald    sine_sample_rate = int(sys.argv[2])
271c326df3SMilanka Ringwald
281c326df3SMilanka Ringwald    if sine_frequency <= 0:
291c326df3SMilanka Ringwald        print(usage)
301c326df3SMilanka Ringwald        sys.exit(1)
311c326df3SMilanka Ringwald
321c326df3SMilanka Ringwald    if sine_sample_rate <= 0:
331c326df3SMilanka Ringwald        print(usage)
341c326df3SMilanka Ringwald        sys.exit(1)
351c326df3SMilanka Ringwald
36*5c544019SMatthias Ringwald    sine_num_samples = int(sine_sample_rate/sine_frequency)
37*5c544019SMatthias Ringwald    print(type(sine_num_samples).__name__)
381c326df3SMilanka Ringwald    print(sine_array.format(sine_sample_rate=sine_sample_rate, sine_frequency=sine_frequency))
391c326df3SMilanka Ringwald    items = 0
401c326df3SMilanka Ringwald    for sample in range(0,sine_num_samples):
411c326df3SMilanka Ringwald        items = items + 1
421c326df3SMilanka Ringwald        angle = (sample * 360.0) / sine_num_samples
431c326df3SMilanka Ringwald        sine = math.sin(math.radians(angle))
441c326df3SMilanka Ringwald        rescaled = int(round(sine * 32767))
45*5c544019SMatthias Ringwald        print ("%6d, " % rescaled, end=''),
461c326df3SMilanka Ringwald        if items == VALUES_PER_LINE:
471c326df3SMilanka Ringwald            items = 0
48*5c544019SMatthias Ringwald            print("")
491c326df3SMilanka Ringwald
501c326df3SMilanka Ringwald    print( "};")
51