File:Processing losses for 3 window functions.gif
Summary
Description |
English: Comparison of three window functions in terms of their effects on equal-strength sinusoids with additive noise. The noise "floor" is smoothed by averaging many DFTs to reveal the substantial difference in levels, caused by the different window functions. In each case, the sinusoid on the left suffers no scalloping and the one on the right exhibits worst-case scalloping. The rectangular window produces the most scalloping but lowest noise-floor. The Hann window has a higher noise floor but much less potential scalloping, which results in the lowest "worst case processing loss" of these 3 functions. |
|||
Date | ||||
Source | Own work | |||
Author | Bob K | |||
Permission (Reusing this file) |
I, the copyright holder of this work, hereby publish it under the following license:
|
|||
Other versions |
Derivative works of this file: Processing losses for 3 window functions.svgCategory:Files with derivative versions,
|
|||
GIF development | ||||
Octave/gnuplot source | click to expand
This graphic was created with the help of the following Octave script: pkg load signal
graphics_toolkit gnuplot
clear all; close all; clc
hfig= figure("position",[100 0 574 609]);
N = 256; % sams_per_fft;
window1 = rectwin(N)'/sum(rectwin(N));
window2 = hann(N)'/sum(hann(N));
window3 = blackmanharris(N)'/sum(blackmanharris(N));
%
Fs = N; % sams_per_sec;
HzPerBin = Fs/N;
F1 = -20.0*HzPerBin; % bin -20
F2 = +20.5*HzPerBin; % bin 20.5
%
L = 100000;
n = 1:L;
x = exp(j*2*pi*F1/Fs*n) + exp(j*2*pi*F2/Fs*n);
x = x + (randn(1,L) +j*randn(1,L))*1.4;
%
sams_per_offset = 0.75*N; % overlap = 25%
%
% number of samples available beyond just one FFT
excess_sams = length(x) - N;
%
j1 = floor( excess_sams / sams_per_offset );
sams_per_offset = floor( excess_sams / j1 );
num_ffts = 1 + j1;
%
% define the first block of data
samples = 1:N;
%
amplitude1 = zeros(1,N);
amplitude2 = zeros(1,N);
amplitude3 = zeros(1,N);
%
% Loop over all the available blocks
for j1 = 1 : num_ffts
amplitude1 = amplitude1 + abs(fft( x(samples) .* window1 ));
amplitude2 = amplitude2 + abs(fft( x(samples) .* window2 ));
amplitude3 = amplitude3 + abs(fft( x(samples) .* window3 ));
samples = samples + sams_per_offset;
end
%
amplitude1 = 20*log10(fftshift(amplitude1/num_ffts));
amplitude2 = 20*log10(fftshift(amplitude2/num_ffts));
amplitude3 = 20*log10(fftshift(amplitude3/num_ffts));
%
abscissa = -40:40;
set(gca,'FontSize',8)
subplot(3,1,1);
h = area(abscissa, amplitude1(abscissa +N/2+1), ...
'FaceColor', [.871 .49 0], 'edgecolor', [.871 .49 0]);
set(h,'BaseValue',-20)
set(gca, 'XTick', [-20 0 20.5], 'XTickLabel',[' '; ' '; ' '], 'YGrid','on', 'color', 'white')
title('Processing losses for sinusoids in additive noise','fontsize', 12);
xlim([-40 40])
ylim([-20 2])
ylabel('decibels')
text(-40, 3.5, 'Rectangular window')
%
subplot(3,1,2);
h = area(abscissa, amplitude2(abscissa +N/2+1), ...
'FaceColor', [.871 .49 0], 'edgecolor', [.871 .49 0]);
set(h,'BaseValue',-20)
set(gca, 'XTick', [-20 0 20.5], 'XTickLabel',[' '; ' '; ' '], 'YGrid','on', 'color', 'white')
xlim([-40 40])
ylim([-20 2])
ylabel('decibels')
text(-40, 3.5, 'Hann window')
%
subplot(3,1,3);
h = area(abscissa, amplitude3(abscissa +N/2+1), ...
'FaceColor', [.871 .49 0], 'edgecolor', [.871 .49 0]);
set(h,'BaseValue',-20)
set(gca, 'XTick', [-20 0 20.5], 'XTickLabel',[' '; ' '; ' '], 'YGrid','on', 'color', 'white')
xlim([-40 40])
ylim([-20 2])
ylabel('decibels')
text(-40, 3.5, 'Blackman-Harris')
|
Category:CC-Zero
Category:Created with GNU Octave
Category:Files with derivative versions
Category:Images with Gnuplot source code
Category:Images with Octave source code
Category:PNG created with LibreOffice
Category:Pages using deprecated source tags
Category:Self-published work
Category:Vector version available
Category:Window function