Apply a variable delay to an audio signal
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hi,
Ill try to explain my goal, then where I am so far.
I am trying to simulate a moving sound source by creating a 2 microphone signals. The first channel contains a set of harmonic sinusoids with different amplitudes and frequencies. The second channel should be a delayed version of the first channel. I would like the delay to start at zero, move to -1 millisecond, back to zero, then to +1 millisecond before returning again to zero delay. In this way by computing the time delay of arrival with a simple cross correlation it would appear the sound source is to one side then the other.
To accomplish this I have found dsp.VariableIntegerDelay class which I think is suitable for the task, however I believe this is only available in 2011a, I have the student version 2011a. Is there another way to create this variable delay in the second signal?
Help is much appreciated! thanks Jesse
0 commentaires
Réponse acceptée
Daniel Shub
le 5 Sep 2011
What you want to do is "delay" time by some amount. If your waveform is:
sin(2*pi*f*t)
then the delayed version is:
sin(2*pi*f*(t-tau))
where tau can be either a scalar or a vector the same size as t whose magnitude represents the delay in seconds. A better solution is probably to delay one channel by tau/2 and advance the other channel by tau/2. You do not specify how you want the delay to change. I am assuming a sinusoidal change, but you could easily make it linear (or anything else).
Fs = 44.1e3;
t = (0:1/Fs:1)';
tau = 1e-3*sin(2*pi*t);
f0 = 100;
N = 10;
x = zeros(length(t), 2);
for ii = 1:N
x = x+[sin(2*pi*ii*f0*(t-tau/2)), sin(2*pi*ii*f0*(t+tau/2))];
end
Plus de réponses (1)
Fangjun Jiang
le 5 Sep 2011
If you want to delay a signal, usually you can pad zeros in front of it. Let's say x is your signal data, it's sample time is 0.1 millisecond, then you need to pad 10 zeros at the beginning to reflect 1 millisecond delay.
Ts=1e-4;
Delay=1e-3;
N=Delay/Ts;
y=[zeros(1,N) x];%x is row vector
%y=zeros(N,1);x];%x is column vector
Not sure what you mean by delay -1 millisecond. You want to cut off 1 millisecond of sound? That's easy.
y=x(N+1:end);
3 commentaires
Daniel Shub
le 5 Sep 2011
One problem with adding zeros is that with the typical sample rate of 44.1 kHz a single 0 adds a delay of over 22 micro seconds. This is over twice the magnitude of the delay that is just detectable. It is much better to add the delay in the frequency domain.
Fangjun Jiang
le 5 Sep 2011
Now I think Daniel's answer using sin(2*pi*f*(t-tau)) is what you want since you are not really delay an existing signal. You are creating two signals with designed delay among them.
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!