Envelope Example

Updated Main Test to include Envelope Example
This commit is contained in:
Darell Chua Yun Da
2021-12-02 14:16:57 +08:00
parent 74586d31c6
commit e3c4b4931d
4 changed files with 49 additions and 2 deletions

37
src/DarellEnvelope.m Normal file
View File

@@ -0,0 +1,37 @@
function output = DarellEnvelope(input, Fs, attack,decay,sustain,release) %percentages for attack, decay, sustain, release
len = length(input);
T = (len-1)/Fs;
attacktime = attack * T * Fs;
decaytime = attacktime + decay * T * Fs;
sustaintime = (T - (release * T))* Fs;
x = 0:1/Fs:T;
y = 0 .* x; %create zero array of y of len x
output = y;%create zero array of output of len x
tcounter = 1;
%attack phase
while tcounter <= attacktime
y(tcounter) = (1/attacktime) * tcounter;
tcounter = tcounter+1;
end
istart = tcounter;
while tcounter<= decaytime
y(tcounter) = 1 - (((1-sustain)/(decay * T * Fs)) * (tcounter - istart));
tcounter = tcounter+1;
end
while tcounter<= sustaintime
y(tcounter) = sustain;
tcounter = tcounter+1;
end
istart = tcounter;
while tcounter < (T * Fs)
y(tcounter) = sustain - ((sustain/(release * T * Fs)) * (tcounter - istart));
tcounter = tcounter+1;
end
for counter = 1:1:len
output(counter) = y(counter) * input(counter);
end
end

View File

@@ -0,0 +1,20 @@
function output_y = DarellbandpassFilter(y,Fs,LOW,MED,HIGH)
Len = length(y);
F = Fs * (-Len/2 : (Len/2 - 1))/Len ;
Mod_Freq = fftshift(fft(y));
lenf = length(F);
output = 0 .* Mod_Freq; % zero array of len f
for n = 1:lenf
if ((LOW < abs(F(n))) && HIGH > abs(F(n)))
output(n) = 1;
else
output(n) = 0;
end
end
filtered_Mod_Freq = fftshift(Mod_Freq .* output);
output_y = real(ifft(filtered_Mod_Freq));
end

View File

@@ -22,4 +22,14 @@ x = DarellbandpassFilter(x,fs,LOW,MED,HIGH);
%play over 5 counts, should only hear 200hz
playtime = 5;
play_continuous(x, fs, playtime)
play_continuous(x, fs, playtime)
attack = 0.2;
decay = 0.2;
sustain = 0.2;
release = 0.1;
x = DarellEnvelope(x, fs, attack,decay,sustain,release);
%play over 5 counts, should only hear 200hz
playtime = 5;
play_continuous(x, fs, playtime)