nicks1980 0 30 марта, 2019 Опубликовано 30 марта, 2019 (изменено) · Жалоба Удивился сравнив целочисленный вариант fft без комплексной области и вариант с плавающий точкой. С плавающей точкой оказался быстрее процентов на 30. void fftf32_direct(FFTF32* pfft) { int i, ip, ir, is, j, k, ki, kd, l, le, le1, le2; float u1, u2, t1, t2, t3, t4; int n = 1 << pfft->n; int nv = n >> 1; float *x = pfft->p_data; float *fft_c = pfft->p_mat_c; uint16_t *fft_h = pfft->p_mat_h; for ( i = 0 ; i < n ; i++ ) { j = fft_h[i]; if ( i < j ) { t1 = x[i]; x[i] = x[j]; x[j] = t1; } } for ( l = 1 ; l <= pfft->n ; l++ ) { le = 1 << l; le1 = le >> 1; k = n / le1; le2 = le >> 2; for ( i = 0 ; i < n ; i += le ) { ip = i + le1; t1 = x[i]; t3 = x[ip]; x[i] = t1 + t3; x[ip] = t1 - t3; } if ( l > 2) { ki = 0; kd = nv; for ( j = 1 ; j < le2 ; j++) { ki += k; kd -= k; u1 = fft_c[ki]; u2 = fft_c[kd]; for ( i = j, ir = le1 - j ; i < n ; i += le, ir += le) { ip = i + le1; is = ir + le1; t1 = x[i]; t2 = x[ir]; t3 = x[ip]*u1 - x[is]*u2; t4 = x[is]*u1 + x[ip]*u2; x[i] = t1 + t3; x[ir] = t1 - t3; x[ip] = t4 - t2; x[is] = t2 + t4; } } } } }; void ffti32_direct(FFTI32* pfft) { int i, ip, ir, is, j, k, ki, kd, l, le, le1, le2; int64_t u1, u2; int t1, t2; int t3, t4; int n = 1 << pfft->n; int nv = n >> 1; int *x = pfft->p_data; short *fft_c = pfft->p_mat_c; unsigned short *fft_h = pfft->p_mat_h; for ( i = 0 ; i < n ; i++ ) { j = fft_h[i]; if ( i < j ) { t1 = x[i]; x[i] = x[j]; x[j] = t1; } } for ( l = 1 ; l <= pfft->n ; l++ ) { le = 1 << l; le1 = le >> 1; k = n / le1; le2 = le >> 2; for ( i = 0 ; i < n ; i += le ) { ip = i + le1; t1 = x[i]; t3 = x[ip]; x[i] = t1 + t3; x[ip] = t1 - t3; } if ( l > 2) { ki = 0; kd = nv; for ( j = 1 ; j < le2 ; j++) { ki += k; kd -= k; u1 = fft_c[ki]; u2 = fft_c[kd]; for ( i = j, ir = le1 - j ; i < n ; i += le, ir += le) { ip = i + le1; is = ir + le1; t1 = x[i]; t2 = x[ir]; // t3 = ( x[ip] * u1 - x[is] * u2 + ( 1 << 30 ) ) >> 14; // t4 = ( x[is] * u1 + x[ip] * u2 + ( 1 << 30 ) ) >> 14; // t3 -= 1 << ( 30 - 14 ); // t4 -= 1 << ( 30 - 14 ); t3 =( x[ip]*u1 -x[is]*u2 + ( 1<<14-1 ) ) >> (14); t4 =( x[is]*u1 +x[ip]*u2 + ( 1<<14-1 ) ) >> (14); x[i] = t1 + t3; x[ir] = t1 - t3; x[ip] = t4 - t2; x[is] = t2 + t4; } } } } }; Изменено 30 марта, 2019 пользователем nicks1980 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 30 марта, 2019 Опубликовано 30 марта, 2019 (изменено) · Жалоба short заменить на int? Еще мысль - вычисления с сопроцессором при правильном чередовании команд хорошо распаралеливаются с пересылками и индексной арифметикой. И и вообще, целочисленных регистров много, а если к ним еще сопроцессор добавляется... Изменено 30 марта, 2019 пользователем GenaSPB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nicks1980 0 30 марта, 2019 Опубликовано 30 марта, 2019 · Жалоба 3 часа назад, GenaSPB сказал: short заменить на int? Еще мысль - вычисления с сопроцессором при правильном чередовании команд хорошо распаралеливаются с пересылками и индексной арифметикой. И и вообще, целочисленных регистров много, а если к ним еще сопроцессор добавляется... h - перестановки с - это таблица cos раздутая до 1<<14 решил все в float делать. раньше на sam7 в целых считал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksandr Baranov 1 30 марта, 2019 Опубликовано 30 марта, 2019 · Жалоба А чем Вы измеряли? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться