added matlab
This commit is contained in:
Executable
+116
@@ -0,0 +1,116 @@
|
||||
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
|
||||
Reference in New Issue
Block a user