From f31cf21967a451f143b8ae68cbdee869fa13f3c7 Mon Sep 17 00:00:00 2001 From: "Steven P. Crain" Date: Sun, 17 Nov 2024 19:13:56 -0500 Subject: [PATCH 1/3] Add implementation of AudioWindowKaiserBessel --- analyze_fft1024.h | 1 + analyze_fft256.h | 1 + data_windows.c | 178 ++++++++++++++++++++++++++++++++++++++++++++++ gui/index.html | 3 +- keywords.txt | 1 + 5 files changed, 183 insertions(+), 1 deletion(-) diff --git a/analyze_fft1024.h b/analyze_fft1024.h index f61589129..0137aac72 100644 --- a/analyze_fft1024.h +++ b/analyze_fft1024.h @@ -44,6 +44,7 @@ extern const int16_t AudioWindowWelch1024[]; extern const int16_t AudioWindowHamming1024[]; extern const int16_t AudioWindowCosine1024[]; extern const int16_t AudioWindowTukey1024[]; +extern const int16_t AudioWindowKaiserBessel1024[]; } class AudioAnalyzeFFT1024 : public AudioStream diff --git a/analyze_fft256.h b/analyze_fft256.h index 1cdc387a2..d09fc4538 100644 --- a/analyze_fft256.h +++ b/analyze_fft256.h @@ -44,6 +44,7 @@ extern const int16_t AudioWindowWelch256[]; extern const int16_t AudioWindowHamming256[]; extern const int16_t AudioWindowCosine256[]; extern const int16_t AudioWindowTukey256[]; +extern const int16_t AudioWindowKaiserBessel256[]; } class AudioAnalyzeFFT256 : public AudioStream diff --git a/data_windows.c b/data_windows.c index 184b4e723..1f0eff840 100644 --- a/data_windows.c +++ b/data_windows.c @@ -1511,6 +1511,141 @@ const int16_t AudioWindowTukey1024[] __attribute__ ((aligned (4))) = { 11, 5, 1, 0, }; +const int16_t AudioWindowKaiserBessel256[] __attribute__ ((aligned (4))) = { + 20, 28, 37, 47, 59, 72, 87, 105, 124, 145, + 169, 196, 225, 257, 293, 331, 373, 419, 469, 523, + 581, 643, 710, 782, 860, 942, 1030, 1124, 1224, 1330, + 1442, 1561, 1687, 1819, 1959, 2106, 2261, 2423, 2594, 2772, + 2958, 3153, 3357, 3568, 3789, 4018, 4257, 4504, 4760, 5026, + 5300, 5584, 5877, 6179, 6490, 6810, 7139, 7477, 7824, 8180, + 8544, 8917, 9298, 9687, 10085, 10489, 10902, 11321, 11748, 12181, + 12620, 13065, 13516, 13972, 14433, 14899, 15369, 15842, 16319, 16798, + 17279, 17763, 18247, 18733, 19218, 19704, 20188, 20671, 21153, 21631, + 22107, 22579, 23047, 23511, 23969, 24421, 24866, 25305, 25736, 26159, + 26573, 26978, 27373, 27757, 28131, 28494, 28844, 29183, 29508, 29820, + 30119, 30403, 30673, 30928, 31167, 31391, 31599, 31791, 31966, 32125, + 32266, 32391, 32497, 32587, 32658, 32712, 32748, 32766, 32766, 32748, + 32712, 32658, 32587, 32497, 32391, 32266, 32125, 31966, 31791, 31599, + 31391, 31167, 30928, 30673, 30403, 30119, 29820, 29508, 29183, 28844, + 28494, 28131, 27757, 27373, 26978, 26573, 26159, 25736, 25305, 24866, + 24421, 23969, 23511, 23047, 22579, 22107, 21631, 21153, 20671, 20188, + 19704, 19218, 18733, 18247, 17763, 17279, 16798, 16319, 15842, 15369, + 14899, 14433, 13972, 13516, 13065, 12620, 12181, 11748, 11321, 10902, + 10489, 10085, 9687, 9298, 8917, 8544, 8180, 7824, 7477, 7139, + 6810, 6490, 6179, 5877, 5584, 5300, 5026, 4760, 4504, 4257, + 4018, 3789, 3568, 3357, 3153, 2958, 2772, 2594, 2423, 2261, + 2106, 1959, 1819, 1687, 1561, 1442, 1330, 1224, 1124, 1030, + 942, 860, 782, 710, 643, 581, 523, 469, 419, 373, + 331, 293, 257, 225, 196, 169, 145, 124, 105, 87, + 72, 59, 47, 37, 28, 20 +}; + +const int16_t AudioWindowKaiserBessel1024[] __attribute__ ((aligned (4))) = { + 20, 22, 24, 26, 28, 30, 32, 34, 36, 39, + 41, 44, 47, 49, 52, 55, 58, 62, 65, 68, + 72, 75, 79, 83, 87, 91, 95, 100, 104, 109, + 113, 118, 123, 128, 134, 139, 145, 150, 156, 162, + 169, 175, 181, 188, 195, 202, 209, 217, 224, 232, + 240, 248, 256, 265, 273, 282, 291, 300, 310, 320, + 330, 340, 350, 361, 371, 382, 394, 405, 417, 429, + 441, 453, 466, 479, 492, 506, 520, 534, 548, 562, + 577, 592, 608, 623, 639, 655, 672, 689, 706, 723, + 741, 759, 777, 796, 815, 834, 854, 874, 894, 915, + 936, 957, 979, 1001, 1023, 1046, 1069, 1093, 1117, 1141, + 1165, 1190, 1216, 1241, 1267, 1294, 1321, 1348, 1376, 1404, + 1432, 1461, 1490, 1520, 1550, 1581, 1611, 1643, 1675, 1707, + 1740, 1773, 1806, 1840, 1875, 1910, 1945, 1981, 2017, 2054, + 2091, 2129, 2167, 2205, 2244, 2284, 2324, 2364, 2405, 2447, + 2489, 2531, 2574, 2618, 2662, 2706, 2751, 2797, 2843, 2889, + 2936, 2984, 3032, 3080, 3129, 3179, 3229, 3280, 3331, 3383, + 3435, 3488, 3541, 3595, 3650, 3705, 3760, 3816, 3873, 3930, + 3988, 4046, 4105, 4164, 4224, 4285, 4346, 4407, 4469, 4532, + 4595, 4659, 4724, 4789, 4854, 4920, 4987, 5054, 5122, 5190, + 5259, 5329, 5399, 5470, 5541, 5613, 5685, 5758, 5831, 5906, + 5980, 6055, 6131, 6207, 6284, 6362, 6440, 6518, 6598, 6677, + 6758, 6839, 6920, 7002, 7084, 7168, 7251, 7335, 7420, 7505, + 7591, 7678, 7765, 7852, 7940, 8029, 8118, 8207, 8298, 8388, + 8480, 8571, 8664, 8756, 8850, 8944, 9038, 9133, 9228, 9324, + 9421, 9517, 9615, 9713, 9811, 9910, 10009, 10109, 10210, 10310, + 10412, 10513, 10616, 10718, 10821, 10925, 11029, 11133, 11238, 11343, + 11449, 11555, 11662, 11769, 11876, 11984, 12092, 12201, 12310, 12419, + 12529, 12639, 12750, 12861, 12972, 13084, 13196, 13308, 13420, 13533, + 13647, 13760, 13874, 13988, 14103, 14218, 14333, 14448, 14564, 14680, + 14796, 14913, 15030, 15146, 15264, 15381, 15499, 15617, 15735, 15853, + 15972, 16090, 16209, 16328, 16448, 16567, 16687, 16806, 16926, 17046, + 17166, 17286, 17407, 17527, 17648, 17768, 17889, 18010, 18131, 18251, + 18372, 18493, 18614, 18735, 18856, 18978, 19099, 19220, 19341, 19462, + 19583, 19704, 19824, 19945, 20066, 20187, 20307, 20428, 20548, 20668, + 20789, 20909, 21029, 21148, 21268, 21387, 21507, 21626, 21745, 21863, + 21982, 22100, 22218, 22336, 22454, 22571, 22688, 22805, 22922, 23038, + 23154, 23269, 23385, 23500, 23615, 23729, 23843, 23957, 24070, 24183, + 24295, 24408, 24519, 24631, 24742, 24852, 24962, 25072, 25181, 25290, + 25398, 25506, 25613, 25720, 25826, 25932, 26037, 26142, 26246, 26349, + 26452, 26555, 26657, 26758, 26859, 26959, 27058, 27157, 27256, 27353, + 27450, 27547, 27642, 27737, 27832, 27925, 28018, 28111, 28202, 28293, + 28383, 28473, 28562, 28650, 28737, 28823, 28909, 28994, 29078, 29161, + 29244, 29326, 29407, 29487, 29566, 29644, 29722, 29799, 29875, 29950, + 30024, 30097, 30170, 30242, 30312, 30382, 30451, 30519, 30586, 30652, + 30717, 30782, 30845, 30908, 30969, 31030, 31089, 31148, 31205, 31262, + 31318, 31372, 31426, 31479, 31531, 31581, 31631, 31680, 31727, 31774, + 31820, 31864, 31908, 31950, 31992, 32032, 32072, 32110, 32147, 32183, + 32219, 32253, 32286, 32318, 32348, 32378, 32407, 32435, 32461, 32487, + 32511, 32534, 32556, 32578, 32598, 32616, 32634, 32651, 32666, 32681, + 32694, 32707, 32718, 32728, 32737, 32744, 32751, 32757, 32761, 32765, + 32767, 32767, 32767, 32767, 32765, 32761, 32757, 32751, 32744, 32737, + 32728, 32718, 32707, 32694, 32681, 32666, 32651, 32634, 32616, 32598, + 32578, 32556, 32534, 32511, 32487, 32461, 32435, 32407, 32378, 32348, + 32318, 32286, 32253, 32219, 32183, 32147, 32110, 32072, 32032, 31992, + 31950, 31908, 31864, 31820, 31774, 31727, 31680, 31631, 31581, 31531, + 31479, 31426, 31372, 31318, 31262, 31205, 31148, 31089, 31030, 30969, + 30908, 30845, 30782, 30717, 30652, 30586, 30519, 30451, 30382, 30312, + 30242, 30170, 30097, 30024, 29950, 29875, 29799, 29722, 29644, 29566, + 29487, 29407, 29326, 29244, 29161, 29078, 28994, 28909, 28823, 28737, + 28650, 28562, 28473, 28383, 28293, 28202, 28111, 28018, 27925, 27832, + 27737, 27642, 27547, 27450, 27353, 27256, 27157, 27058, 26959, 26859, + 26758, 26657, 26555, 26452, 26349, 26246, 26142, 26037, 25932, 25826, + 25720, 25613, 25506, 25398, 25290, 25181, 25072, 24962, 24852, 24742, + 24631, 24519, 24408, 24295, 24183, 24070, 23957, 23843, 23729, 23615, + 23500, 23385, 23269, 23154, 23038, 22922, 22805, 22688, 22571, 22454, + 22336, 22218, 22100, 21982, 21863, 21745, 21626, 21507, 21387, 21268, + 21148, 21029, 20909, 20789, 20668, 20548, 20428, 20307, 20187, 20066, + 19945, 19824, 19704, 19583, 19462, 19341, 19220, 19099, 18978, 18856, + 18735, 18614, 18493, 18372, 18251, 18131, 18010, 17889, 17768, 17648, + 17527, 17407, 17286, 17166, 17046, 16926, 16806, 16687, 16567, 16448, + 16328, 16209, 16090, 15972, 15853, 15735, 15617, 15499, 15381, 15264, + 15146, 15030, 14913, 14796, 14680, 14564, 14448, 14333, 14218, 14103, + 13988, 13874, 13760, 13647, 13533, 13420, 13308, 13196, 13084, 12972, + 12861, 12750, 12639, 12529, 12419, 12310, 12201, 12092, 11984, 11876, + 11769, 11662, 11555, 11449, 11343, 11238, 11133, 11029, 10925, 10821, + 10718, 10616, 10513, 10412, 10310, 10210, 10109, 10009, 9910, 9811, + 9713, 9615, 9517, 9421, 9324, 9228, 9133, 9038, 8944, 8850, + 8756, 8664, 8571, 8480, 8388, 8298, 8207, 8118, 8029, 7940, + 7852, 7765, 7678, 7591, 7505, 7420, 7335, 7251, 7168, 7084, + 7002, 6920, 6839, 6758, 6677, 6598, 6518, 6440, 6362, 6284, + 6207, 6131, 6055, 5980, 5906, 5831, 5758, 5685, 5613, 5541, + 5470, 5399, 5329, 5259, 5190, 5122, 5054, 4987, 4920, 4854, + 4789, 4724, 4659, 4595, 4532, 4469, 4407, 4346, 4285, 4224, + 4164, 4105, 4046, 3988, 3930, 3873, 3816, 3760, 3705, 3650, + 3595, 3541, 3488, 3435, 3383, 3331, 3280, 3229, 3179, 3129, + 3080, 3032, 2984, 2936, 2889, 2843, 2797, 2751, 2706, 2662, + 2618, 2574, 2531, 2489, 2447, 2405, 2364, 2324, 2284, 2244, + 2205, 2167, 2129, 2091, 2054, 2017, 1981, 1945, 1910, 1875, + 1840, 1806, 1773, 1740, 1707, 1675, 1643, 1611, 1581, 1550, + 1520, 1490, 1461, 1432, 1404, 1376, 1348, 1321, 1294, 1267, + 1241, 1216, 1190, 1165, 1141, 1117, 1093, 1069, 1046, 1023, + 1001, 979, 957, 936, 915, 894, 874, 854, 834, 815, + 796, 777, 759, 741, 723, 706, 689, 672, 655, 639, + 623, 608, 592, 577, 562, 548, 534, 520, 506, 492, + 479, 466, 453, 441, 429, 417, 405, 394, 382, 371, + 361, 350, 340, 330, 320, 310, 300, 291, 282, 273, + 265, 256, 248, 240, 232, 224, 217, 209, 202, 195, + 188, 181, 175, 169, 162, 156, 150, 145, 139, 134, + 128, 123, 118, 113, 109, 104, 100, 95, 91, 87, + 83, 79, 75, 72, 68, 65, 62, 58, 55, 52, + 49, 47, 44, 41, 39, 36, 34, 32, 30, 28, + 26, 24, 22, 20 +}; + /* #! /usr/bin/perl @@ -1616,3 +1751,46 @@ for ($i=0; $i < $len; $i++) { print "\n" unless ($len % 10) == 9; print "};\n"; */ + +/* +#! /usr/bin/python + +import numpy +import scipy.special + +"https://en.wikipedia.org/wiki/Window_function" + +N=255 + +scale = 32767.4 / 0.999931 + +def transform(x): + x *= 32768 + x[x>32767] = 32767 + return (x+0.5).astype(numpy.int16) + +def kaiser(x, len, a=3): + a = a * numpy.pi + x = 2*x/(len-1)-1 + return scipy.special.i0(a * numpy.sqrt(1-x*x)) / scipy.special.i0(a) + +if __name__ == "__main__": + len = 1024 + cols = 10 + name = "KaiserBessel" + func = kaiser + kwargs = {'a': 3} + + y = func(numpy.arange(0,len), len, **kwargs) + y = transform(y) + + print(f"const int16_t AudioWindow{name}{len}[] __attribute__ ((aligned (4))) = {{") + + tail = "," + for i in range(0, len, cols): + if i+cols >= len: + tail = "" + print(",".join(map("{:6d}".format,y[i:i+cols])) + tail) + + print("};") +*/ diff --git a/gui/index.html b/gui/index.html index bf1858f84..994e2bd6d 100644 --- a/gui/index.html +++ b/gui/index.html @@ -4933,6 +4933,7 @@

Notes

  • AudioWindowHamming256
  • AudioWindowCosine256
  • AudioWindowTukey256
  • +
  • AudioWindowKaiserBessel256
  • @@ -4999,7 +5000,7 @@

    Notes

  • AudioWindowWelch1024
  • AudioWindowHamming1024
  • AudioWindowCosine1024
  • -
  • AudioWindowTukey1024
  • +
  • AudioWindowKaiserBessel1024
  • 1024 point FFT has a peak CPU usage of approx 52% on Teensy 3.1. diff --git a/keywords.txt b/keywords.txt index 5193eb415..53a6eefb9 100644 --- a/keywords.txt +++ b/keywords.txt @@ -234,6 +234,7 @@ AudioWindowWelch256 LITERAL1 AudioWindowHamming256 LITERAL1 AudioWindowCosine256 LITERAL1 AudioWindowTukey256 LITERAL1 +AudioWindowKaiserBessel256 LITERAL1 FILTER_LOPASS LITERAL1 FILTER_HIPASS LITERAL1 From dd6577db8c3f3d41d6e1e05121ee73b38cd5a611 Mon Sep 17 00:00:00 2001 From: "Steven P. Crain" Date: Sun, 17 Nov 2024 19:37:51 -0500 Subject: [PATCH 2/3] Revert accidentally deleted line. --- gui/index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/gui/index.html b/gui/index.html index 994e2bd6d..b3fe3de5e 100644 --- a/gui/index.html +++ b/gui/index.html @@ -5000,6 +5000,7 @@

    Notes

  • AudioWindowWelch1024
  • AudioWindowHamming1024
  • AudioWindowCosine1024
  • +
  • AudioWindowTukey1024
  • AudioWindowKaiserBessel1024
  • From 4cf7afe5d0233c11cb8b350406b29404044c4f9a Mon Sep 17 00:00:00 2001 From: "Steven P. Crain" Date: Mon, 18 Nov 2024 22:41:48 -0500 Subject: [PATCH 3/3] Bumped library version --- library.json | 2 +- library.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library.json b/library.json index c4756c1eb..48dc9a04d 100644 --- a/library.json +++ b/library.json @@ -5,7 +5,7 @@ "keywords": "sound, audio, FFT, filter, effect", "description": "Teensy Audio Library", "url": "http://www.pjrc.com/teensy/td_libs_Audio.html", - "version": "1.3", + "version": "1.4", "export": { "exclude": [ "gui", diff --git a/library.properties b/library.properties index aa60d4fe4..df39a5d2c 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Audio -version=1.3 +version=1.4 author=Paul Stoffregen maintainer=Paul Stoffregen sentence=Teensy Audio Library - Flexible, High Quality Audio Processing