4 #define FFT_LEN XMMSC_VISUALIZATION_WINDOW_SIZE 9 #define AMP_LOG_SCALE_THRESHOLD0 0.001f 10 #define AMP_LOG_SCALE_DIVISOR 6.908f 11 #define FREQ_LOG_SCALE_BASE 2.0f 15 static gboolean fft_ready = FALSE;
16 static gboolean fft_done;
24 window[i] = 0.5 - 0.5 * cos (2.0 * M_PI * i /
FFT_LEN);
34 fft (
short *samples, gfloat *spec)
36 gint nv2, k, l, j = 0, i;
41 buf[i][0] = (float) samples[j++];
42 buf[i][0] += (float) samples[j++];
43 buf[i][0] /= (float) (1 << 17);
44 buf[i][0] *= window[i];
56 buf[i - 1][0] = buf[j - 1][0];
57 buf[i - 1][1] = buf[j - 1][1];
78 gfloat w_r = cosf (M_PI / (
float) le1);
79 gfloat w_i = -sinf (M_PI / (
float) le1);
81 for (j = 1; j <= le1; j++) {
82 for (i = j; i <=
FFT_LEN; i += le) {
85 t_r = buf[ip - 1][0] * u_r - u_i * buf[ip - 1][1];
86 t_i = buf[ip - 1][1] * u_r + u_i * buf[ip - 1][0];
88 buf[ip - 1][0] = buf[i - 1][0] - t_r;
89 buf[ip - 1][1] = buf[i - 1][1] - t_i;
91 buf[i - 1][0] = buf[i - 1][0] + t_r;
92 buf[i - 1][1] = buf[i - 1][1] + t_i;
95 t_r = u_r * w_r - w_i * u_i;
96 u_i = w_r * u_i + w_i * u_r;
102 for (i = 0; i < nv2; i++) {
103 spec[i] = hypot (buf[i][0], buf[i][1]);
115 fill_buffer_fft (int16_t* dest,
int size,
short *src)
130 for (i = 0; i <
FFT_LEN / 2; ++i) {
131 if (spec[i] >= 1.0) {
132 dest[i] = htons (SHRT_MAX);
133 }
else if (spec[i] < 0.0) {
142 dest[i] = htons ((int16_t)(tmp * SHRT_MAX));
154 for (i = 0; i < size; i += channels) {
155 if (src[i] > 0 && src[i] > l) {
158 if (src[i] < 0 && -src[i] > l) {
162 if (src[i+1] > 0 && src[i+1] > r) {
165 if (src[i+1] < 0 && -src[i+1] > r) {
178 dest[0] = htons ((l + r) / 2);
183 for (i = 0, j = 0; i < size; i += channels, j++) {
190 r = &dest[size/channels + j];
195 *r = htons (src[i+1]);
207 size = fill_buffer_fft (dest, size, src);
Properties of the delivered vis data.