ADSR envelope shaping on audio file
    7 visualizzazioni (ultimi 30 giorni)
  
       Mostra commenti meno recenti
    
I'm trying to apply ADSR envelope shaping to an audio file as shown below.
load handel y Fs;
N = 1.5 * Fs;
t = [0:N-1]/Fs;
x = y/Fs;
env = interp1([0 0.1 0.3 1.1 1.5], [0 1 0.4 0.4 0], t);
y = env .* x;
sound(y,Fs)
However, when performing the .* calculation, MATLAB freezes as the calculation is too large.
Could you assist in solving this problem? Thanks in advance.
2 Commenti
Risposta accettata
  Mathieu NOE
      
 il 7 Nov 2020
        hi
so finally found the bug is due to improper t (time)  definition 
t is supposed to span from 0 to 1.5 according to the envelope specs, and have N samples
NB : the t and env lines must both have "1.5" in common otherwise there will be error msg
from there , everything runs smooth, the env is applied to the entire audio file 
N);
see below : 
load handel y Fs;
N = length(y);
t = linspace(0,1.5,N); % must be consistent with env definition below : [0 0.1 0.3 1.1 1.5]
env = interp1([0 0.1 0.3 1.1 1.5], [0 1 0.4 0.4 0], t);
env = env(:);
 y = env .* y(:);
sound(y,Fs)
% 
if you want to generalize the code and make it more robust , you should consider define the interp1 arguments as vectors 
and generate t according to something like  : 
vect1 = [0 0.1 0.3 1.1 1.5];
vect2 = [0 1 0.4 0.4 0];
env = interp1(vect1, vect2, t);
t = linspace(vect1(1),vect1(end),N);
% so improved code suggestion 
load handel y Fs;
N = length(y);
vect1 = [0 0.1 0.3 1.1 1.5];
vect2 = [0 1 0.4 0.4 0];
t = linspace(vect1(1),vect1(end),N);
env = interp1(vect1, vect2, t);
env = env(:);
y = env .* y(:);
sound(y,Fs)
Più risposte (1)
  Mathieu NOE
      
 il 6 Nov 2020
        ok 
so simple problem of vector dimensions mismatch in your code 
the env vector is either too short or the vector on which it is applied is too long 
you have to modify one or the other 
below my 2 cents suggestion, assuming N was supposed to be the number of samples extracted from the original file  
also I didn't get why the line : x = y/Fs; this will simply reduce the amplitude of the output signal to almost zero 
load handel y Fs;
N = round(1.5 * Fs); % why 1;5 ??
t = [0:N-1]/Fs;
% x = y/Fs;     % why ??
env = interp1([0 0.1 0.3 1.1 1.5], [0 1 0.4 0.4 0], t);
env = env(:);
x_truncated = y(1:N);   % only the first N samples of the audio file 
x_truncated = x_truncated(:);
y = env .* x_truncated;
sound(y,Fs)
3 Commenti
  Mathieu NOE
      
 il 6 Nov 2020
				Was the size of the envelope supposed to equal the length of the total audio file ? 
if yes you simply have to correct the t (time) vector length 
N = length(y) ;   (and not   N = round(1.5 * Fs))
Vedere anche
Categorie
				Scopri di più su Get Started with Audio Toolbox in Help Center e File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

