Here, you can find the SNR of a received signal from periodogram / FFT bins using the Kaiser operator. The beta (ฮฒ) parameter characterizes the Kaiser window, which controls the trade-off between the main lobe width and the side lobe level in the frequency domain. For that you should know the sampling rate of the signal.
The Kaiser window is a type of window function commonly used in signal processing, particularly for designing finite impulse response (FIR) filters and performing spectral analysis. It is a general-purpose window that allows for control over the trade-off between the main lobe width (frequency resolution) and side lobe levels (suppression of spectral leakage). The Kaiser window is defined using a modified Bessel function of the first kind.
Steps
- Set up the sampling rate and time vector
- Compute the FFT and periodogram
- Plot the periodogram using FFT
- Specify parameters for Kaiser window and periodogram
- Calculate the frequency resolution and signal power
- Exclude the signal power from noise calculation
- Compute the noise power
- Calculate the SNR
MATLAB Code for Estimation of SNR from FFT bins of a Noisy Signal
clear;
close all;
% Parameters
fs = 8000; % Sampling frequency (Hz)
f_tone = 1000; % Tone frequency (Hz)
N = 8192; % Use large N so 1000 Hz aligns with an FFT bin
t = (0:N-1)/fs; % Time vector
% Generate 1 kHz sine wave
signal = sin(2*pi*f_tone*t);
% Add white Gaussian noise
SNR_true_dB = 20; % Desired true SNR in dB
signal_power = mean(signal.^2);
noise_power = signal_power / (10^(SNR_true_dB/10));
noise = sqrt(noise_power) * randn(1, N);
noisy_signal = signal + noise;
% Apply window to reduce leakage
w = hamming(N)';
windowed_signal = noisy_signal .* w;
U = sum(w.^2)/N; % Window power normalization factor
% FFT
X = fft(windowed_signal);
f = (0:N-1)*fs/N;
% Power spectrum
Pxx = abs(X).^2 / (fs * N * U); % Proper normalization for PSD
% Find signal bin (closest to 1 kHz)
[~, signal_bin] = min(abs(f - f_tone));
% Estimate signal power from ±1 bins around 1 kHz
signal_bins = signal_bin-1 : signal_bin+1;
signal_power_est = sum(Pxx(signal_bins));
% Estimate noise power from all other bins
noise_bins = setdiff(1:N/2, signal_bins); % Use only one-sided spectrum
noise_power_est = sum(Pxx(noise_bins));
% Estimate SNR
SNR_est = signal_power_est / noise_power_est;
SNR_est_dB = 10 * log10(SNR_est);
% Print results
fprintf('True SNR: %.2f dB\n', SNR_true_dB);
fprintf('Estimated SNR from FFT: %.2f dB\n', SNR_est_dB);
% Plot
figure;
plot(f(1:N/2), 10*log10(Pxx(1:N/2)));
xlim([0 fs/2]);
xlabel('Frequency (Hz)');
ylabel('Power/Frequency (dB/Hz)');
title('Power Spectrum of Noisy Signal with Hamming Window');
grid on;
Output
Estimated SNR from FFT: 19.77 dB
MATLAB Code for Estimation of Signal-to-Noise Ratio from Power Spectral Density Using FFT and Kaiser Window Periodogram from real signal data
fs = 32000;
t = 0:1/fs:1-1/fs;
x=load("x2.mat");
x = x.x2;
N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:fs/length(x):fs/2;
figure; plot(freq,pow2db(psdx))
grid on
title("Periodogram Using FFT")
xlabel("Frequency (Hz)")
ylabel("Power/Frequency (dB/Hz)")
%rng default
Fi = 3000;
Fs = 32e3;
N = 1024;%2048;
w = kaiser(numel(x),38);
[Pxx, F] = periodogram(x,w,numel(x),Fs);
SNR_periodogram = snr(Pxx,F,'psd')
freq_resolution= abs(F(2)-F(3));
Signal_power= Pxx(3000); % p
s=sum((Signal_power), 1); s=s/length(Signal_power); s=abs(s);
Sig_power=pow2db(freq_resolution*s)
exclude_range = pxx(3000);
Noise_power = Pxx;
Noise_power(exclude_range) = 0; % Set the values in the specified range to zero
% Noise_power= Pxx(20001:24001); %x,y,z
n=sum((Noise_power), 1)/length(Noise_power); n=abs(n);
N_power=pow2db(freq_resolution*n)
SNR=Sig_power-N_power