📄 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 + -