?? demodulator.cpp
字號:
#include <stdafx.h>
#include <stdlib.h>
#include "Demodulator.h"
void ResetDemodulator(Demodulator& m) {
m.ib=0;
m.masko=0x80;
// m.iSym=0;
}
void InitDemodulator(Demodulator& m, DemodMethod method, AWGN* gauss) {
m.DemodOneSig=DemodCores[method].DemodOneSig;
m.InitDemCore=DemodCores[method].InitDemCore;
m.CloseDemCore=DemodCores[method].CloseDemCore;
m.Reliability=DemodCores[method].GetReliability;
if (DemodCores[method].CoreStructSize>0)
{
m.DemCoreRegs=(void*)malloc(DemodCores[method].CoreStructSize);
}
else m.DemCoreRegs=NULL;
if (m.InitDemCore!=NULL) m.InitDemCore(m.DemCoreRegs);
m.inW=DemodCores[method].sigDim;
m.outW=DemodCores[method].symWid;
m.masktop=(1<<(m.outW-1));
m.outbuf=(byte*)malloc(sizeof(byte)*(1+(m.outW+7)/8));
//:上一步緩存中最多余7bits,每步至多產生outWidth bits
m.reliabuf=(double*)malloc(sizeof(double)*m.outW);//可信度信息的輸出不以字節為單位
m.gauss=gauss;
ResetDemodulator(m);
}
void CloseDemodulator(Demodulator& m) {
free(m.outbuf);
free(m.reliabuf);
// free(m.symbol);
if (m.CloseDemCore!=NULL)
{
m.CloseDemCore(&m.DemCoreRegs);
free(m.DemCoreRegs);
}
}
int DemodOneSignal(const double* sig, byte*& output, Demodulator& m) {
m.outbuf[0]=m.outbuf[m.ib]; m.ib=0;
UINT s;
m.DemodOneSig(s, sig, m.gauss, m.DemCoreRegs);
for (UINT mask=m.masktop; mask!=0; mask>>=1)
{
if ((s & mask)==0) m.outbuf[m.ib]&=(~m.masko); else m.outbuf[m.ib]|=m.masko;
if (m.masko==0x01)
{
m.ib++;
m.masko=0x80;
}
else m.masko>>=1;
}
output=m.outbuf;
return m.ib;
}
/*輸入Modulator.outW個信號矢量,輸出Modulator.inW個比特可信度數值*/
int DemodOneSignal(const double* sig, double*& output, Demodulator& m) {
int outWidth=m.Reliability(m.reliabuf, sig, m.gauss, m.DemCoreRegs);
output=m.reliabuf;
byte* meanless;
DemodOneSignal(sig, meanless, m);
return outWidth;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -