Time-spread multiple echoing of audio signals I have been reading papers related to adding echos into digital audio signals recently. I guess I understood the logic behind, yet I guess I am still having lack of DSP knowledge to figure out everything. 

In order to add a single echo delay $\Delta$ into audio signal $S$ using convolution operator, echo kernel $k(n)$ is defined as:

$$ k(n)= \delta [n] + \alpha \cdot \delta [n-\Delta]$$

where $\delta [n]$ is Kronecker Delta Function, and $ 0 &lt; \alpha \ll 1.$

Echoed sound signal $S'$ calculated using convolution operator "$*$" as:

$$S'=S \ * k(n)$$

I have no problems until this part. My question is based on this publication, [Ko, Nishimura, Suzuki - 2005]. It is based on echo data hiding for audio watermarking (steganography), but a very good source to understand sound echos. Authors say that multiple echos provide better quality for HAS than single echos (see Fig. 1.)



A pseudorandom sequence is generated to spread multiple echos in time. I generate it in MATLAB with the following code:

rand('seed', key);         % set seed of random sequence
a = rand(length, 1);       
prseq = (a &gt; 0.5)*2-1;     % convert into -1 and +1  


In next step, time-spread echo kernel is defined using PN Sequence as: (see Fig. 2.)

$$ k(n)= \delta [n] + \alpha \cdot P[n-\Delta],  0 &lt; \alpha \ll 1 $$



Schemetic explanation is made in Fig. 3. below:



I tried this tecnique in MATLAB and I actually have two questions:


Audio signal is being corrupted when the number of echos increases no matter how small $\alpha$ value is chosen. In the same article length of PN Sequence is chosen as $1023$, and delay = 1 ms which is about 44 samples in 44.1 kHz audio signal. So how is it possible to provide "a real room" echos as it is said in the article? Do I miss anything?


I am adding my summarized MATLAB codes:

delta = 44;
alpha = 0.02;

% Single echo kernel
for n=1:delta+1
    k_single(n) = kdelta(n-1) + alpha*kdelta(n-delta-1);
end

% Time-spread echo kernel without using kronecker delta:
kernel = [1 zeros(1,delta-1) alpha*prseq'];

echoed = conv(audio_data, kernel);

function [ out ] = kdelta( x )
    out = double((x==0));
end


Alternatively:

single_echo = signal + alpha*[zeros(1,delta) signal(1:length(signal)-delta)];



I was adding echos in an audio signal by shifting and adding as I mentioned above "alternatively". I figured out that it would take so much time to use it for multiple echos, so I thought I had to use convolution. But conv(x,y) function in matlab changing data size up to length(x)+length(y)-1 according to definition of convolution. Is it a good idea to just to crop it like echoed(1:length(audio_data)) to keep the length fixed? What is best option to accomplish multiple echoing as fast as possible and using less memory?


Excuse me for such a long question. I wanted to explain my problem in details, so it made my question longer.

Thanks in advance.
I'm not that familiar with the technique but reading up it looks like you basically just want an echoic convolution kernel of some sort which you can apply. I don't think the kernel you are building there is correct - if you want, for example, a single echo then the convolution kernel would need to contain two impulses, one at zero offset and one offset into the kernel by the time delay of the echo. For further echoes you would want further impulses, again offset into the kernel by their delay amount. You can have more sophisticated echo kernels but I would suggest this as a starting point



In response to question 2 I would not crop your signal unless it is particularly important to keep the length the same. Keeping the tail will make the deconvolution more accurate and unless your kernal is huge it won't be a very noticeable extension of the signal.