1 /* GStreamer
2  * (c) 2011 Stefan Kost <ensonic@users.sf.net>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  */
19 
20 #include <stdio.h>
21 #include <gst/fft/gstffts16.h>
22 #include <gst/fft/gstffts32.h>
23 #include <gst/fft/gstfftf32.h>
24 #include <gst/fft/gstfftf64.h>
25 
26 /* effectively max range seems to be 1/4 of what it should be */
27 
28 #define MAKE_I_TEST(_g_,_G_,_t_,_T_,_f_)                        \
29 static void                                                     \
30 test_##_t_ (const gchar *test_name, gint num_freq, gint window) \
31 {                                                               \
32   GstFFT ##_T_ *ctx;                                            \
33   GstFFT ##_T_ ##Complex *fdata;                                \
34   _g_ *adata;                                                   \
35   _g_ maxfr = 0, maxfi = 0;                                     \
36   gint num_samples = num_freq * 2 - 2;                          \
37   gint s, f;                                                    \
38                                                                 \
39   ctx = gst_fft_ ##_t_ ##_new (num_samples, FALSE);             \
40   fdata = g_new (GstFFT ##_T_ ##Complex, num_freq);             \
41   adata = g_new (_g_, num_samples);                             \
42                                                                 \
43   for (s = 0; s < num_samples;) {                               \
44     adata[s++]=G_MIN##_G_;                                      \
45     adata[s++]=G_MAX##_G_;                                      \
46   }                                                             \
47                                                                 \
48   gst_fft_ ##_t_ ##_window (ctx, adata, window);                \
49   gst_fft_ ##_t_ ##_fft (ctx, adata, fdata);                    \
50                                                                 \
51   for (f = 0; f < num_freq; f++) {                              \
52     if (fdata[1+f].r > maxfr)                                   \
53       maxfr = fdata[1+f].r;                                     \
54     if (fdata[1+f].i > maxfi)                                   \
55       maxfi = fdata[1+f].i;                                     \
56   }                                                             \
57                                                                 \
58   printf (#_t_" %-15s: maxfr: %"_f_" %10.5f maxfi: %"_f_" %10.5f\n",\
59     test_name,                                                  \
60     maxfr, (gfloat)G_MAX##_G_/maxfr,                            \
61     maxfi, (gfloat)G_MAX##_G_/maxfi);                           \
62                                                                 \
63   gst_fft_ ##_t_ ##_free (ctx);                                 \
64   g_free (fdata);                                               \
65   g_free (adata);                                               \
66 }
67 
68 MAKE_I_TEST (gint16, INT16, s16, S16, "6d");
69 MAKE_I_TEST (gint32, INT32, s32, S32, "9d");
70 
71 #define MAKE_F_TEST(_g_,_G_,_t_,_T_,_f_)                        \
72 static void                                                     \
73 test_##_t_ (const gchar *test_name, gint num_freq, gint window) \
74 {                                                               \
75   GstFFT ##_T_ *ctx;                                            \
76   GstFFT ##_T_ ##Complex *fdata;                                \
77   _g_ *adata;                                                   \
78   _g_ maxfr = 0, maxfi = 0;                                     \
79   gint num_samples = num_freq * 2 - 2;                          \
80   gint s, f;                                                    \
81                                                                 \
82   ctx = gst_fft_ ##_t_ ##_new (num_samples, FALSE);             \
83   fdata = g_new (GstFFT ##_T_ ##Complex, num_freq);             \
84   adata = g_new (_g_, num_samples);                             \
85                                                                 \
86   for (s = 0; s < num_samples;) {                               \
87     adata[s++]=-1.0;                                            \
88     adata[s++]=+1.0;                                            \
89   }                                                             \
90                                                                 \
91   gst_fft_ ##_t_ ##_window (ctx, adata, window);                \
92   gst_fft_ ##_t_ ##_fft (ctx, adata, fdata);                    \
93                                                                 \
94   for (f = 0; f < num_freq; f++) {                              \
95     if (fdata[1+f].r > maxfr)                                   \
96       maxfr = fdata[1+f].r;                                     \
97     if (fdata[1+f].i > maxfi)                                   \
98       maxfi = fdata[1+f].i;                                     \
99   }                                                             \
100                                                                 \
101   printf (#_t_" %-15s: maxfr: %"_f_" %10.5f maxfi: %"_f_" %10.5f\n",\
102     test_name,                                                  \
103     maxfr, (gfloat)1.0/maxfr,                                   \
104     maxfi, (gfloat)1.0/maxfi);                                  \
105                                                                 \
106   gst_fft_ ##_t_ ##_free (ctx);                                 \
107   g_free (fdata);                                               \
108   g_free (adata);                                               \
109 }
110 
111 MAKE_F_TEST (gfloat, FLOAT, f32, F32, "10.5f");
112 MAKE_F_TEST (gdouble, DOUBLE, f64, F64, "10.5f");
113 
114 gint
main(gint argc,gchar * argv[])115 main (gint argc, gchar * argv[])
116 {
117   gint num_bands;
118 
119   gst_init (&argc, &argv);
120 
121   num_bands = 200;
122   test_s16 ("200, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
123   test_s16 ("200, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
124   test_s16 ("200, hann", num_bands, GST_FFT_WINDOW_HANN);
125   test_s16 ("200, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
126   test_s16 ("200, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
127   puts ("");
128 
129   num_bands = 300;
130   test_s16 ("300, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
131   test_s16 ("300, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
132   test_s16 ("300, hann", num_bands, GST_FFT_WINDOW_HANN);
133   test_s16 ("300, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
134   test_s16 ("300, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
135   puts ("\n");
136 
137   num_bands = 200;
138   test_s32 ("200, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
139   test_s32 ("200, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
140   test_s32 ("200, hann", num_bands, GST_FFT_WINDOW_HANN);
141   test_s32 ("200, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
142   test_s32 ("200, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
143   puts ("");
144 
145   num_bands = 300;
146   test_s32 ("300, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
147   test_s32 ("300, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
148   test_s32 ("300, hann", num_bands, GST_FFT_WINDOW_HANN);
149   test_s32 ("300, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
150   test_s32 ("300, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
151   puts ("\n");
152 
153   num_bands = 200;
154   test_f32 ("200, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
155   test_f32 ("200, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
156   test_f32 ("200, hann", num_bands, GST_FFT_WINDOW_HANN);
157   test_f32 ("200, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
158   test_f32 ("200, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
159   puts ("");
160 
161   num_bands = 300;
162   test_f32 ("300, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
163   test_f32 ("300, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
164   test_f32 ("300, hann", num_bands, GST_FFT_WINDOW_HANN);
165   test_f32 ("300, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
166   test_f32 ("300, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
167   puts ("\n");
168 
169   num_bands = 200;
170   test_f64 ("200, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
171   test_f64 ("200, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
172   test_f64 ("200, hann", num_bands, GST_FFT_WINDOW_HANN);
173   test_f64 ("200, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
174   test_f64 ("200, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
175   puts ("");
176 
177   num_bands = 300;
178   test_f64 ("300, none", num_bands, GST_FFT_WINDOW_RECTANGULAR);
179   test_f64 ("300, hamming", num_bands, GST_FFT_WINDOW_HAMMING);
180   test_f64 ("300, hann", num_bands, GST_FFT_WINDOW_HANN);
181   test_f64 ("300, bartlett", num_bands, GST_FFT_WINDOW_BARTLETT);
182   test_f64 ("300, blackman", num_bands, GST_FFT_WINDOW_BLACKMAN);
183   puts ("\n");
184 
185   return 0;
186 }
187