示例#1
0
  void TurboCodeWithZP::Decoder_term(const itpp::cvec& in1,
                                     const itpp::cvec& in2,
                                     double n0, int iterations) const
  {
    // std::cout << "## zeroPadding_ = " << zeroPadding_.PadPositions() << std::endl;

    int memory = rsc1_.Constraint() - 1;
    static itpp::vec llrZeros(0);
    if (llrZeros.size() != memory){
      llrZeros.set_size(memory);
      llrZeros.zeros();
    } // if
    
    for (int ite = 0; ite < iterations; ++ite){
      itpp::vec llrToRsc1_mod = zeroPadding_.ModifyLLR(llrToRsc1_);
      
      itpp::vec llrFromRsc1;
      rsc1_.Decode(in1, llrToRsc1_mod, &llrFromRsc1, n0);
      
      itpp::vec llrFromRsc1_mod = zeroPadding_.ModifyLLR(llrFromRsc1);
            
      itpp::vec llrToRsc2 = Interleave(llrFromRsc1_mod.left(interleaver_.size()), interleaver_);
      llrToRsc2 = itpp::concat(llrToRsc2, llrZeros);

      itpp::vec llrFromRsc2;
      rsc2_.Decode(in2, llrToRsc2, &llrFromRsc2, n0);

      llrToRsc1_ = Deinterleave(llrFromRsc2.left(interleaver_.size()), interleaver_);
      llrToRsc1_ = itpp::concat(llrToRsc1_, llrZeros);
    } // for ite    
  }
示例#2
0
  void TurboCode::Decoder_term(const itpp::cvec &in1,
                               const itpp::cvec &in2,
                               double n0, int iteration) const
  {
    int memory = rsc1_.Constraint() - 1;
    static itpp::vec llrZeros(0);
    if (llrZeros.size() != memory){
      llrZeros.set_size(memory);
      llrZeros.zeros();
    } // if

    for (int ite = 0; ite < iteration; ++ite){
      itpp::vec llrFromRsc1;
      rsc1_.Decode(in1, llrToRsc1_, &llrFromRsc1, n0);

      itpp::vec llrToRsc2 = Interleave(llrFromRsc1.left(interleaver_.size()), interleaver_);
      llrToRsc2 = itpp::concat(llrToRsc2, llrZeros);

      itpp::vec llrFromRsc2;
      rsc2_.Decode(in2, llrToRsc2, &llrFromRsc2, n0);

      llrToRsc1_ = Deinterleave(llrFromRsc2.left(interleaver_.size()), interleaver_);
      llrToRsc1_ = itpp::concat(llrToRsc1_, llrZeros);
    } // for ite

  }
示例#3
0
  void TurboCode::doDecode(const itpp::cvec &receivedSignal, itpp::bvec *output, double n0) const
  {
    assert(receivedSignal.size() % codeRate_.denominator() == 0);

    
    itpp::cvec in1, in2;
    SeparateReceivedSignal(receivedSignal, &in1, &in2);
    
    Decoder(in1, in2, n0, iteration_);

    itpp::bvec interleaved_output = rsc2_.HardDecision();
    (*output) = Deinterleave(interleaved_output, interleaver_);
        
  }
示例#4
0
  void TurboCode::Decoder(const itpp::cvec &in1,
                          const itpp::cvec &in2, double n0, int iteration) const
  {
    for (int ite = 0; ite < iteration; ++ite){
      itpp::vec llrFromRsc1;
      rsc1_.Decode(in1, llrToRsc1_, &llrFromRsc1, n0);
      
      itpp::vec llrToRsc2 = Interleave(llrFromRsc1, interleaver_);

      itpp::vec llrFromRsc2;
      rsc2_.Decode(in2, llrToRsc2, &llrFromRsc2, n0);
      
      llrToRsc1_ = Deinterleave(llrFromRsc2, interleaver_);
    } // for ite
    
  }
示例#5
0
  void TurboCode::doDecode_term(const itpp::cvec& receivedSignal, itpp::bvec* output,
                                   double n0) const
  {
    int memory = rsc1_.Constraint() - 1;
    
    itpp::cvec in1, in2;
    SeparateReceivedSignal(receivedSignal, &in1, &in2);

    itpp::cvec tail1 = receivedSignal.mid(3*interleaver_.size(), 2*memory);
    itpp::cvec tail2 = receivedSignal.right(2*memory);

    in1 = itpp::concat(in1, tail1);
    in2 = itpp::concat(in2, tail2);
    
    Decoder_term(in1, in2, n0, iteration_);
    
    itpp::bvec interleaved_output = rsc2_.HardDecision();
    (*output) = Deinterleave(interleaved_output.left(interleaver_.size()), interleaver_);
  }
示例#6
0
  /************************************************************************************
   * TurboCodeWithZP 
   * 
   * Implementation of Turbo Code with Zero Padding
   ************************************************************************************/
  void TurboCodeWithZP::Decoder(const itpp::cvec &in1,
                                const itpp::cvec &in2, double n0, int iterations) const
  {
    for (int ite = 0; ite < iterations; ++ite){
      itpp::vec llrToRsc1_mod = zeroPadding_.ModifyLLR(llrToRsc1_);
      
      itpp::vec llrFromRsc1;
      rsc1_.Decode(in1, llrToRsc1_mod, &llrFromRsc1, n0);

      itpp::vec llrFromRsc1_mod = zeroPadding_.ModifyLLR(llrFromRsc1);
      
      itpp::vec llrToRsc2 = Interleave(llrFromRsc1_mod.left(interleaver_.size()), interleaver_);

      itpp::vec llrFromRsc2;
      rsc2_.Decode(in2, llrToRsc2, &llrFromRsc2, n0);

      llrToRsc1_ = Deinterleave(llrFromRsc2.left(interleaver_.size()), interleaver_);
    } // for ite
    
  }
示例#7
0
		template <> SIMD_INLINE uint16x8_t ReduceColTail<false>(const uint8_t *src)
		{
			const uint8x8x2_t t01 = vld2_u8(src - 1);
			const uint8x8x2_t t23 = Deinterleave(LoadAfterLast<1>(LoadAfterLast<1>(vld1q_u8(src - 1))));
            return vaddq_u16(vaddl_u8(t01.val[0], t23.val[1]), vmulq_u16(vaddl_u8(t01.val[1], t23.val[0]), K16_0003));
        }
示例#8
0
		SIMD_INLINE uint16x8_t ReduceColNose(const uint8_t * src)
		{
			const uint8x8x2_t t01 = Deinterleave(LoadBeforeFirst<1>(vld1q_u8(src)));
			const uint8x8x2_t t23 = vld2_u8(src + 1);
            return vaddq_u16(vaddl_u8(t01.val[0], t23.val[1]), vmulq_u16(vaddl_u8(t01.val[1], t23.val[0]), K16_0003));
        }
示例#9
0
文件: ilbm.c 项目: frost242/demoscene
__regargs BitmapT *LoadILBM(const char *filename, BOOL interleaved) {
  BitmapT *bitmap = NULL;
  PaletteT *palette = NULL;
  IffFileT iff;

  if (OpenIff(&iff, filename)) {
    if (iff.header.type == ID_ILBM) {
      BOOL compression = FALSE;

      while (ParseChunk(&iff)) {
        BitmapHeaderT bmhd;

        switch (iff.chunk.type) {
          case ID_BMHD:
            ReadChunk(&iff, &bmhd);
            bitmap = NewBitmap(bmhd.w, bmhd.h, bmhd.nPlanes, interleaved);
            compression = bmhd.compression;
            break;

          case ID_CMAP:
            palette = NewPalette(iff.chunk.length / sizeof(ColorT));
            ReadChunk(&iff, palette->colors);
            break;
        
          case ID_BODY:
            {
              BYTE *data = MemAlloc(iff.chunk.length, MEMF_PUBLIC);
              LONG size = iff.chunk.length;

              ReadChunk(&iff, data);

              if (compression) {
                LONG newSize = bitmap->bplSize * bitmap->depth;
                BYTE *uncompressed = MemAlloc(newSize, MEMF_PUBLIC);

                UnRLE(data, size, uncompressed);
                MemFree(data, size);

                data = uncompressed;
                size = newSize;
              }

              if (!interleaved)
                Deinterleave(data, bitmap);
              else
                memcpy(bitmap->planes[0], data, bitmap->bplSize * bitmap->depth);

              MemFree(data, size);
            }
            break;

          default:
            SkipChunk(&iff);
            break;
        }
      }

      if (bitmap)
        bitmap->palette = palette;
    }

    CloseIff(&iff);
  } else {
    Log("File '%s' missing.\n", filename);
  }

  return bitmap;
}