117 lines
2.8 KiB
Matlab
Executable File
117 lines
2.8 KiB
Matlab
Executable File
function eval_blit()
|
|
Nb = 33;
|
|
Nos = 1000;
|
|
fs = 48000;
|
|
f = 440;
|
|
fcut = 16000;
|
|
P = fs/f
|
|
Pi = floor(P)
|
|
Pf = fix(Nos*(fs/f - Pi))
|
|
|
|
x = (0:Nb*Nos-1) - (Nb*Nos-1)/2;
|
|
H = sinc(2*fcut/fs.*x/Nos).*Kaiser(Nos*Nb, 8)';
|
|
for ii=0:Nos-1,
|
|
for jj=0:Nb-1
|
|
Hs(ii+1,jj+1) = H(Nos-ii+Nos*jj);
|
|
end
|
|
end;
|
|
|
|
%Hs = init_steps(Nb, Nos);
|
|
|
|
k = 1./sum(Hs');
|
|
%k = ones(1, Nb);
|
|
y0 = 0;
|
|
y1 = 0;
|
|
y2 = .5;
|
|
ks = 0.002*f/55
|
|
ii = 0;
|
|
ff = 0;
|
|
nn = 1;
|
|
jj = Nb;
|
|
kk = 1;
|
|
for i = 1:32000,
|
|
if ii == 0
|
|
jj = 1;
|
|
kk = ff + 1;
|
|
ii = Pi;
|
|
ff = ff + Pf;
|
|
if ff > (Nos-1)
|
|
ff = ff - Nos;
|
|
ii = ii + 1;
|
|
end
|
|
end;
|
|
ii = ii - 1;
|
|
if jj <= Nb
|
|
y0 = y0 + k(kk)*Hs(kk,jj); % - ks*y0;
|
|
jj = jj + 1;
|
|
end;
|
|
y0 = y0 - ks*y0;
|
|
y1 = 1 - y0;
|
|
y2 = 0.001*y1 + 0.999*y2;
|
|
blit(nn) = y1-y2;
|
|
nn = nn + 1;
|
|
end;
|
|
wavwrite(0.7*blit, fs, 'blit.wav');
|
|
|
|
for ii = 1:Nos
|
|
step(ii,:) = k(ii).*filter(Hs(ii,:), 1, [ones(1,Nb)]);
|
|
end
|
|
|
|
close all
|
|
plot(1:length(blit), blit, '-o'); grid;
|
|
|
|
figure
|
|
plot(abs(fft(blit))); grid;
|
|
|
|
figure
|
|
plot(step', '-'); grid;
|
|
|
|
figure
|
|
plot(Hs(1,:)', '-+'); grid;
|
|
|
|
function steps = init_steps(step_width, phase_count)
|
|
|
|
low_pass = 0.999; % lower values filter more high frequency
|
|
high_pass = 0.990; % lower values filter more low frequency
|
|
|
|
%phase_count = 32; % number of phase offsets to sample band-limited step at
|
|
%step_width = 16; % number of samples in each final band-limited step
|
|
|
|
%steps [phase_count] [step_width]; // would use short for speed in a real program
|
|
|
|
% Generate master band-limited step by adding sine components of a square wave
|
|
master_size = step_width * phase_count;
|
|
% master [master_size]; // large; might want to malloc() instead
|
|
for i = 0:master_size-1
|
|
master(i+1) = 0.5;
|
|
end;
|
|
|
|
gain = 0.5 / 0.777; % adjust normal square wave's amplitude of ~0.777 to 0.5
|
|
sine_size = 256 * phase_count + 2;
|
|
max_harmonic = sine_size / 2 / phase_count;
|
|
for h = 1:2:max_harmonic
|
|
amplitude = gain / h;
|
|
to_angle = 3.14159265358979323846 * 2 / sine_size * h;
|
|
for i = 0:master_size-1
|
|
master(i+1) = master(i+1) + sin( (i - master_size / 2) * to_angle ) * amplitude;
|
|
end
|
|
gain = gain * low_pass;
|
|
end
|
|
|
|
% Sample master step at several phases
|
|
for phase = 0:phase_count-1
|
|
error = 1.0;
|
|
prev = 0.0;
|
|
for i = 0:step_width-1
|
|
cur = master (i * phase_count + (phase_count - 1 - phase)+1);
|
|
delta = cur - prev;
|
|
error = error - delta;
|
|
prev = cur;
|
|
steps (phase+1, i+1) = delta;
|
|
end
|
|
|
|
% each delta should total 1.0
|
|
steps (phase+1, step_width / 2) = steps (phase+1, step_width / 2) + error * 0.5;
|
|
steps (phase+1, step_width / 2 + 1) = steps (phase+1, step_width / 2 + 1) + error * 0.5;
|
|
end
|