Hi, Jean-Marc Valin wrote:> Well, you could change the order in the encoder as long as you reverse > it in the decoder as well.Ok, I see that in the split_cb_shape_sign_unquant function, that each coefficient is tied to it's position in the nb_subvect exc coefficients. Honestly, I have problems understanding what exactly the codebook search works like. If you have the time to to that, Jean-Marc, I would appreciate some hints on the following: 1. What is the point in multiplying a codebook index with some number ant adding a loop variable to it as done in the exc unquant function. for (j=0;j<subvect_size;j++) exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j]; 2. How does the CB search function split_cb_search_shape_sign work? I know the parameter N defines the number of candidates for each of the nb_subvect CB line numbers which are later on written into the stream. But especially, how the best_ntarget list is being updated, I am a little clueless. Regards, Bj?rn PS: for me personally, I'd like to know how to change the cb id found while keeping the error introduced by this low. -- Many a writer seems to think he is never profound except when he can't understand his own meaning. -- George D. Prentice -- Important! Please recognize my new GPG Public Key! Bj?rn Thalheim gpg fingerprint: 2F22 AAEB 1818 1548 EC78 1AE8 9D2E FCB4 0980 28CC download key: wget http://www.ifsr.de/~bjoern/gpg/public_key.asc See also: http://www.ifsr.de/~bjoern/gpg/key.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 252 bytes Desc: OpenPGP digital signature Url : http://lists.xiph.org/pipermail/speex-dev/attachments/20060919/b7bf65d5/signature.pgp
> 1. What is the point in multiplying a codebook index with some number > ant adding a loop variable to it as done in the exc unquant function. > for (j=0;j<subvect_size;j++) > exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j];That's just how you represent a 2D array in C: the codebook has shape_cb_size entries and subvect_size samples per entry.> 2. How does the CB search function split_cb_search_shape_sign work? I > know the parameter N defines the number of candidates for each of the > nb_subvect CB line numbers which are later on written into the stream. > But especially, how the best_ntarget list is being updated, I am a > little clueless.Hard to explain simply. It's a fundamental thing in CELP.> PS: for me personally, I'd like to know how to change the cb id found > while keeping the error introduced by this low.That's for steganography? I'd say you just look at the nbest list and chose the 2nd, 3rd, ... best entry instead of the first. Jean-Marc
Hi, Jean-Marc Valin wrote:>> 1. What is the point in multiplying a codebook index with some number >> ant adding a loop variable to it as done in the exc unquant function. >> for (j=0;j<subvect_size;j++) >> exc[subvect_size*i+j]+=s*0.03125*shape_cb[ind[i]*subvect_size+j]; > > That's just how you represent a 2D array in C: the codebook has > shape_cb_size entries and subvect_size samples per entry.Ok, that helps. Thanks.>> PS: for me personally, I'd like to know how to change the cb id found >> while keeping the error introduced by this low. > > That's for steganography? I'd say you just look at the nbest list and > chose the 2nd, 3rd, ... best entry instead of the first.Yes. I already introduced into the LSP prediction such an nbest list to do that straightforward. My goal is to make sure if nothing is embedded, the altered Speex version still needs to write exactly the same coefficients as the original non-stego version. For my scenario, I stick to NB encoding at 15kbps, so N is equal to 2. So all I can do, in my opinion, is to check if the LSBs of best_nind[0][i] and best_nind[1][i] (for each i in 0:nb_subvect) are different. The Problem is, that I would like to know how big the error is, which I introduce into the signal by this change. But in the end, I only know the ndist for all indexes of the last one of these nb_subvect indexes. (I could increase N of course, but I guess the condition stated in the second line of the first paragraph here could be violated by that) So for my choice stated above, I can only change something on the last of these nb_subvect CB line IDs, because I can measure the impact by (ndist[0]-ndist[1])^2, only for i==nb_subvect-1 but for each i<nb_subvect-1 I don't know what the impact is on the overall error. So I think if I want to have control, I can only use the last of these nb_subvect codebook entries. Am I right on this? Regards, Bj?rn -- Q: How do you stop an elephant from charging? A: Take away his credit cards. -- Important! Please recognize my new GPG Public Key! Bj?rn Thalheim gpg fingerprint: 2F22 AAEB 1818 1548 EC78 1AE8 9D2E FCB4 0980 28CC download key: wget http://www.ifsr.de/~bjoern/gpg/public_key.asc See also: http://www.ifsr.de/~bjoern/gpg/key.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 252 bytes Desc: OpenPGP digital signature Url : http://lists.xiph.org/pipermail/speex-dev/attachments/20060919/113c7c69/signature.pgp