I'm working on a little project, which centers around steganography. As part of it, I want to implement the audio echo hiding method, but the problem is, I've never done anything related to digital signal processing. To get the hang of what I am going to do, I've done some initial research and skimmed through some papers, and here I am trying to verify if I got it right. I'm going to be mostly working with audio sample rate of 44.1kHz if that somehow matters.
While encoding is quite simple, I'm having a tough time trying to understand the decoding process, especially understaing what cepstrum actually is.
So here's the entire decoding process that I'd like you to clarify for me. (you can also read about it for example in IBM System Journal's "Techniques for data
First step is splitting up the signal into blocks of length
L is the power of 2, that's easy.
Second step is applying FFT to each block, aaaaand this is where the "fun" begins. It makes sense to map the 16-bit signal into double-precision floats. But does the range of converted signal actually matter? If I had to go blind, I'd just map it to
[-1, 1] range. Then do I need any windowing here? None of the articles I read mentioned it, but it's commonly referenced alongside FFT topics.
Now that I'm in frequency domain, I can do some calculations. Squared complex natural logarithm gives me what after IFFT will become the autocorrelation of signal's cepstrum. At least that's what papers say.
And now is the moment that I'm really scared of. IFFT brings me back to time domain, along with array of
L complex values. Among them there are 2 points of interest, which, according to what I read, should let me recover encoded data.
d1 hold the amount of echo delay added for encoding bit 0 and 1 respectively. So, in a 0-indexed array, if value (real part? or does the imaginary part also matter here?) in
out[d0] is bigger than value in
out[d1], then the encoded bit is 0. It seems to be way too simple, so I suppose it's not correct, or is it? So what am I missing? What did I get wrong? Maybe I should compare absolute values? Or maybe my lack of knowledge made me completely misinterpret this algorithm?
Are there any relations between examined block length and delay value, that I should take note of?