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
How about this: the codebook search gives you the N best (in order) combinations of entries for the current sub-frame. You can simply compute a one-bit checksum on all the codebook entries and choose which of the N-best to use based on that and the "message" you have. Of course, there will be cases where all of the N-best match to the same checksum, but that's what error-correcting codes are for. Jean-Marc Bj?rn Thalheim a ?crit :> 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 > >
Hi, Jean-Marc Valin wrote:> How about this: the codebook search gives you the N best (in order) > combinations of entries for the current sub-frame. You can simply > compute a one-bit checksum on all the codebook entries and choose > which of the N-best to use based on that and the "message" you have.So you're suggesting, I can either write into the stream: - nind[0][0..nb_subvect], or - nind[1][0..nb_subvect], or - nind[2][0..nb_subvect], or - ... Or do I have to do a little more hacking in the search function to get the N best _combinations_ of CB IDs? Wouldn't it be easier and just as effective (for N==2) to do the following: Get nb_subvect indeces to write into the stream. Write all but the last of these into the stream. If nind[0][nb_subvect-1] and nind[1][nb_subvect-1] have different LSBs and if the difference between ndist[0] and ndist[1] is small enough (smaller than the normal variation of ndist[0], which can be measured), we can decide to write nind[1][nb_subvect-1] into the stream instead of nind[0][nb_subvect-1]. (that's actually what I am doing right now)> Of course, there will be cases where all of the N-best match to the > same checksum, but that's what error-correcting codes are for.Yes, thats called Wet Paper Code writing (http://www.ws.binghamton.edu/fridrich/Research/WPC_TransactionsJournal1.pdf). It gives the Embedder the freedom to decide where something can be embedded and where not without requiring that knowledge from the receiver. Very interesting thing. Its origin is in hard disk fault tolerance and its principles where documented several decades ago. So my goal is right now, to find out where and how I can change things. Regards, Bj?rn -- Tomorrow, this will be part of the unchangeable past but fortunately, it can still be changed today. -- 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/2ab517e1/signature.pgp