Вот модель, меняя параметр WIDTH можно сравнивать реализацию fixed point FFT и floating point single precision FFT.
Код
clear all;
Ns = 4096;
fs = 100e3;
Ts = 1/fs;
t = 0:Ts:(Ns-1)*Ts;
SNR = 30;
df = fs/Ns;
f = 0:df:(Ns-1)*df;
f0 = 7e3;
f1 = 19e3;
A0 = 1e0;
A1 = 1e-1;
x = real(A0*exp(1i*2*pi*f0*t) + A1*exp(1i*2*pi*f1*t));
y = awgn(x, SNR, 'measured');
WIDTH = 16;
y_fi = sfi(y, WIDTH);
w = fi_radix2twiddles(Ns);
w_fi = sfi(w, WIDTH);
%y = y.*w;
Y_fp = abs(fft(single(y))); Y_fp = Y_fp/max(Y_fp);
Y_fi = abs(fi_m_radix2fft_withscaling(y_fi, w_fi));
Y_fi_ver = double(Y_fi); Y_fi_ver = Y_fi_ver/max(Y_fi_ver);
err = Y_fp - Y_fi_ver;
err = err .* err;
str = sprintf('fixed point n%d', WIDTH);
figure(1); clf();
subplot(2, 1, 1);
hold on;
plot(f, 20*log10(double(Y_fp) + 1e-15), 'b');
plot(f, 20*log10(double(Y_fi_ver) + 1e-15), 'xr');
title('ABS(FFT) result');
xlabel('frequency, Hz');
ylabel('abs(fft), dB');
legend('floating point single', str);
grid on;
hold off;
axis([0 fs/2 -60 1]);
subplot(2, 1, 2);
plot(f, 10*log10(err + 1e-15));
grid on;
xlabel('frequency, Hz');
ylabel('Square error, dB');
axis([0 fs/2 -120 0]);
Пример графика для вашего случая
Для 15 бит, как видно из графика, ошибка fixed point реализации пренебрежима мала в сравнении с разрешающими способностями Фурье.