pkg load signal
graphics_toolkit gnuplot
M = 1000;
darkgreen = [33 150 33]/256;
interpolation_factor = 4;
% Generate M+1 samples of a Gaussian window (filter type not important)
filter = .3*exp(-.5*(((0:M)-M/2)/(.4*M/2)).^2);
% Sample the window.
N=24;
sam_per_hop = M/N;
window_dots = filter(1+(0:N)*sam_per_hop);
normalize = sum(window_dots)/interpolation_factor;
window_scale_factor = 0.5;
sam_per_hop = sam_per_hop*window_scale_factor;
%------------------------------------------------------------------
figure("position", [100 200 900 600])
% Plot the continuous filter function
xoffset = sam_per_hop*15;
yoffset = 0.1;
plot(xoffset+(0:M)*window_scale_factor, yoffset+filter, "linestyle",":", "linewidth",1, "color","black")
set(gca, "xaxislocation", "origin")
xlim([0 M])
ylim([-.06 .45]) % allows space for negative samples (in case I change the signal)
set(gca, "ygrid","off");
set(gca, "xgrid","on");
set(gca, "ytick",[0], "fontsize",14);
xticks = [0:4*sam_per_hop:M];
set(gca, "xtick",xticks)
set(gca,"xticklabel",[0:length(xticks)])
% Plot the filter coefficients
hold on
plot(xoffset+(0:N)*sam_per_hop, yoffset+window_dots, "color","red", ".", "markersize",10)
% Create signal to be interpolated
samples_per_cycle = 4*M;
signal = .2*sin(2*pi*(0:M)/samples_per_cycle);
signal_dots = signal(1:sam_per_hop:end);
% Simulate "inserted zeros", for display
signal_dots(2:4:end) = 0;
signal_dots(3:4:end) = 0;
signal_dots(4:4:end) = 0;
% Plot the data
L = length(signal_dots);
plot((0:L-1)*sam_per_hop, signal_dots, "color","blue", ".", "markersize",10)
% Compute dot product, and plot it
dot_product = sum(window_dots(24:-4:4).*signal_dots(17:4:37))/normalize;
x = 27*sam_per_hop;
plot(x, dot_product, "color",darkgreen, ".", "markersize",14)
plot([x,x],[0,.45]); % vertical line
% xlabel('\leftarrow n \rightarrow', "fontsize",16)
text(465, -.05, '\leftarrow n \rightarrow', "fontsize",16)
text(18, .1, "X[n]", "fontsize",16, "color","blue")
title("Multirate interpolation filter", "fontsize",16, "fontweight","normal");