xref: /btstack/tool/sine_table_generator.py (revision 293fd5fb21e86fbb29e9789cc0a2c06dafbbf1b3)
11c326df3SMilanka Ringwald#!/usr/bin/env python
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 = '''
18*293fd5fbSMilanka 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
361c326df3SMilanka Ringwald    sine_num_samples = sine_sample_rate/sine_frequency
371c326df3SMilanka Ringwald
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))
451c326df3SMilanka Ringwald        print ("%6d, " % rescaled),
461c326df3SMilanka Ringwald        if items == VALUES_PER_LINE:
471c326df3SMilanka Ringwald            items = 0
481c326df3SMilanka Ringwald            print
491c326df3SMilanka Ringwald
501c326df3SMilanka Ringwald    print( "};")
51