This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320C6713B:使用 C6713进行调制和解调(BPSK)

Guru**** 2589265 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/639807/ccs-tms320c6713b-modulation-and-demodulation-bpsk-using-c6713

器件型号:TMS320C6713B

工具/软件:Code Composer Studio

我使用 了 Chassaing 教科书中的一个程序、其中一个电路板用作发送器、另一个电路板用作使用 BPSK 调制的接收器。 当我构建这两个程序时、.out 文件会成功 生成、没有任何错误。 但是、当我为发送器提供输入时、我不 会听到接收器的任何声音。 有人能不能弄清楚为什么会发生这种情况/  

我还尝试构建 Simulink 模型来实现同样的目的。 这也需要完成构建过程、但当我尝试提供输入时、没有输出。  如果大家想看一下、我可以附加 Simulink 模型。

 对于电路板是否有问题、因为我认为电路板没有问题、因为它适用于许多其他示例。   

随附的是发送器和接收器的.c 文件。

发送器.c

//transmitter.c 以 BPSK 信号的形式传输语音
#include "dsk6713_AIC23.h"//codec-DSK 支持文件
#include
#include "lp15500.cov"//1500Hz 系数低通滤波器
uint32 fs=DSK6713_AIC23_FREQ_48kHz;//设置采样率
#define DSK6713_AIC23_INPUT_MIC 0x0015
#define DSK6713_AIC23_INPUT_LINE 0x0011
uint16 inputsource=DSK6713_AIC23_input_MIC;//选择输入
根据符号#define NUMSAMP 4 //#样片
#define MAX_DATA_LENGTH 10 //修改/解调矢量的大小
define NUM_BITS 8 //每个样本的位数
#define SYNC_INTERVAL 100 //同步位之间的间隔
短 encSeqNum = 8;//编码位数
短 encSymbolVal = 0;//编码器符号索引
短 sin_table[NUMSAMP]={0、1000、0、-1000};//对于运营商
短位[8];//保持编码采样
将 sampleBuffer[2000]短接;//查看样本
短 sIndex = 0;//index sampleBuffer
短 syncSequence[8]={1、1、-1、-1、-1、-1};//同步序列
短整型 outv=1;//要编码的位值
短编码 Val = 0;//已过滤输入值
int yn = 0;//init 滤波器的输出
短增益= 10;输出上为//增益
synctimer 短= 0;//跟踪同步之间的时间
#define Left 0 //设置左/右通道
#define RIGHT 1.
union{uint32 uint;short channel[2];}AIC23_data;

中断 void c_int11 ()//中断服务例程

int i;
SAMPLE_DATA 短整型;
sample_data = input_sample();
yn = fircircfunc (sample_data、h、N);//asm func 传递到 A4、B4、A6
if (encSymbolVal >= NUMSAMP)//通过波形递增

encSymbolVal = 0;
encSeqNum++;

if (encSeqNum = NUM_BITS)//发送全部8个位
{//get a new sample
encseqNum = 0;
if (synctim++>= SYNC_INTERVAL)//确定是否
{//发送同步序列
synctimer = 0;
for (i=0;i<8;i++)//在位中放置同步序列
bits[i]= syncSequence[i];

其他
{//获取位
encodeVal =(短整型)(yn >> 15);
对于(i=8;i<16;i++)//编码输入序列
位[I-8]=(encodeVal &(1< }
SampleBuffer[sIndex++]=编码值;
if (sIndex >= 2000) sIndex = 0;

outval =(短)位[encSeqNum];
AIC23_data.channel[RIGHT]=gain*sin_table[encSymbolVal];//carrier->Right 频道
AIC23_data.channel[LEFT]=gain*outval*sin_table[encSymbolVal++];//data->Left
output_sample (AIC23_data.uint);//输出到两个通道

void main(){
COMM_intr ();
while (1);}//init、无限循环

接收器.c

//receiver.c 解调接收到的 BPSK 语音信号
#include "dsk6713_AIC23.h"//codec-DSK 支持文件
#include

uint32 fs=DSK6713_AIC23_FREQ_96kHz;//设置采样率
#define DSK6713_AIC23_INPUT_MIC 0x0015
#define DSK6713_AIC23_INPUT_LINE 0x0011
uint16 inputsource=DSK6713_AIC23_input_MIC;//选择输入
#define NUMSAMP 8 //每个符号的样本数
define NUM_BITS 100
#define PI 3.1415926
#define SYNC_INTERVAL 100 //同步序列之间的间隔
short_sample;//输入样本
DATA_SAMPLE 短整型;

短接 carrier_symbol[NUMSAMP];//缓冲器到接收到一个载波周期
将 DATA_SYMBOL[NUMSAMP*2]短接;//缓冲区接收一个数据周期

短 csIndex=0;//符号缓冲区索引
短 dsIndex=NUMSAMP;//符号缓冲区索引
短 phIndex=0;

#define NHI 100
float phiBuf[NPHI]={0};//缓冲区可查看 PLL 的 φ 估算值
short phibind=0;// phi 缓冲区索引
短相环= 0;//用于确定 PHI 是否环超过0 <phi<2PI

float sin_table[96*NUMSAMP];// sin 波形的3个周期的表
pow_table[16]短整型;//二次幂表

浮点 Y1、Y2;//相关向量
float phi=pi;//相位估算
float dphi = 0;//更改 phi
浮子 DAM=1;//阻尼因子

short decSeqNum = 0;//编码位数
短假序列[9]={0};//编码器符号索引

短 syncSequence[8]={1、1、0、1、0、0、1};//同步序列
短整型 syncTrigger = 0;//触发器以确定是否找到同步序列
短 syncInterval = 0;//查找同步 SEQ 之间的间隔
短接 rBIT[2];//接收到的位
短位[8]={0};//在一帧中接收到位
short bitIndex=0;//索引到帧
short nrBits = 0;//确定缓冲区中接收到的位数

SHORT OUT_SAMPLE = 0;//当前接收的样本
short prev_sample = 0;//之前收到的样本
short prev_sample2 = 0;//在当前样本之前接收到两个样本
short outInc = 0;//通过内插多项式递增

//调试变量

短 TrigBuffer[200]={0};//用于查看传入的触发值
短接 tbIndex = 0;//索引到 TrigBuffer
短回车缓冲器[1000];//载波缓冲器
短数据缓冲器[1000];// BPSK 数据波的缓冲器
短 bufIndex = 0;//索引到 carrierBuffer 和 dataBuffer

short sampleBuffer[2000];//输出样本缓冲器
短接 sBuffer=0;//索引到 samplpleBuffer

int X=0;//在相关接收器中使用

中断 void c_int11 ()//中断服务例程

int i、j;
int max=1;

carrier_sample =(short) input_right_sample ();//接收载波
DATA_SAMPLE =(short) input_left_sample"();//接收数据

carrier_symbol[csIndex++]= carrier_sample;//将 carrier 置于符号缓冲区中
DATA_symbol[dsIndex++]= DATA_sample;//将数据放入符号缓冲区

carrierBuffer[bufIndex]= carrier_sample;//调试载波值
dataBuffer[bufIndex]= DATA_sample;//调试数据值

if (++bufIndex >= 1000)
bufIndex = 0;

if (csIndex >= NUMSAMP)//在接收一个周期后
{//然后执行 φ 估算
Y1 = 0;
Y2 = 0;
csIndex = 0;//重置索引
dsIndex = NUMSAMP;

对于(i=0;i {
Y1 += carrier_symbol[i]*sin_table[32*(NUMSAMP + I + phIndex)-1];
Y2 += carrier_symbol[i]*sin_table[32*(NUMSAMP + I + phIndex)+1];
if (carrier_symbol[i]> max)
max = carrier_symbol[i];

if (max!= 0)

Y1 = Y1 / max;//标准化相关系数
Y2 = Y2 /最大值;

其他

最大值= 1;

dphi = 0.2*(y2 - y1);//计算导数以找到最大值
匹配滤波器的//
if (dphi > pi)//帮助将 φ 保持在0 <phi<2*PI 以内
dφ= PI;
PHI =φ+ dφ;//确定 φ 的新估计值
phiLoop = 0;
if (φ< 0)//将 φ 归一为0 <phi<2*PI

PHI = PHI + 2*PI;
phiLoop =-1;

if (phi >(2*pi))

PHI = PHI - 2*PI;
phiLoop = 1;

phiBuf[phiBind ++]=phi;//将 phi 放置在缓冲区中以供查看
if (phiBind >= NPHI)//重新发送缓冲区索引
phiBind = 0;

phIndex =(int)(NUMSAMP-1)*phi/(2*pi);//将 phi 的索引更新为相关器

if (phiLoop =0)//无换行
{//接收一位
X = 0;
对于(i=0;i {
x += data_symbol[(NUMSAMP-1)-phIndex+I]*sin_table[32*i];
DATA_symbol[i]= DATA_symbol[NUMSAMP + i];

rBIT[0]=(X >=0)? 1:0;//进行检测
nrBits = 1;

if (phiLoop = 1)//φ 包装为0
{//接收到两个位
phiLoop = 0;
X = 0;
对于(i=0;i {
x += data_symbol[i]*sin_table[32*i];

rBIT[0]=(X >=0)? 1:0;//进行检测;

X = 0;
对于(i=0;i {
x += data_symbol[(NUMSAMP-1)-phIndex+I]*sin_table[32*i];
DATA_symbol[i]= DATA_symbol[NUMSAMP + i];

rBit[1]=(X >=0)? 1:0;//进行检测
nrBits = 2;

if (phiLoop =-1)// PHI 包装为2*PI
{//不接收任何位
phiLoop = 0;
for (i=0;<NUMSAMP; i++)
{//更新符号值
DATA_symbol[i]= DATA_symbol[NUMSAMP + i];

nrBits = 0;

对于(i=0;i {
位[bitIndex++]= rBit[i];

假序列[7]= rBIT[i];//将接收到的位放置在 decSeq 缓冲器中
synctrigger = 0;
for (j=0;j<8;j++)//搜索最后8位
{//帧同步序列
if (j < 8)//使用同步序列屏蔽接收的序列

syncTrigger +=(假序列[j]=syncSequence[j]);

假序列[j]=假脱序列[j+1];

synctime++;
if (synctrigger =8)//如果找到同步间隔,则设置帧索引

if (synctInterval =8*(SYNC_INTERVAL + 1))//查找分隔的符号
{//按同步间隔
bitIndex = 0;//设置帧同步点
Prev_sample2 = prev_sample;//使用相同的值
如果存在 SYNC 位、则为 PRE_SAMPLE = OUT_SAMPLE;//用于输出

synctim间隔= 0;

TrigBuffer[tbIndex++]= synctrigger;//调试缓冲区以查看 TRIG
if (tbIndex >= 200)//重置 TRIG 缓冲区索引
tbIndex = 0;


if (bitIndex >= 8)//如果接收到一个字节、则对其进行解码

Prev_sample2 = prev_sample_;//更新第三个多项式顶点
Previ_sample = out_sample;//更新第二个多项式顶点
bitIndex = 0;//将索引复位到位缓冲区中
OUT_SAMPLE=0;//将输出采样设置为零
outInc = 0;//重置多项式 interp 索引
if (bits[7]= 1)//如果负值采用二进制表示

for (j=0;j<7;j++)//屏蔽位二进制补码

位[j]=(位[j]= 0);


for (j=8;j<15;j++)//对位进行解码

out_sample=out_sample_pow_table[j]*位[j-8];

如果(bits[7]= 1)//如果为负,则更改符号并添加1*2^8

out_sample=-(out_sample_256);

sampleBuffer[sBuffer++]= out_sample;
if (sBuffer >= 2000)
sBuffer=0;



if (decSeqNum >= NUM_BITS)//重置解码序列的索引

decSeqNum = 0;

//对输出值使用3点多项式内插
output_sample ((out_sample-2*prev_sample_sample_prev_sample2)*(outinc*outInc/64-outInc)/128
+(prev_sample-prev_sample2)* outInc/64 + prev_sample2);
outinc++;


void init_sin table ()//用于加速计算的表

int i;

for (i=0;i<96*NUMSAMP;i++)//创建正弦波表

Sin_table[i]= sin (2 * pi*i/(32 * NUMSAMP));

for (i=0;i<16;i++)//创建二的幂表

POW_TABLE [i]= pow (2、I);

void main()

init_sin 表();
COMM_intr ();//init DSK、编解码器、McBSP
while (1);//无限循环

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您使用的是裸机示例还是 TI RTOS SDK? 如果您使用的是 SDK、请分享它的版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用 的是裸机示例。 不涉及任何 RTOS。