The 12th IEEE ICCSP

The 12th IEEE International Conference on Communication Systems and Projects


  • invitation

  • registration

  • favorite

Costas环的设计与实现

Posted on 2018-04-16

最近浩哥给我布置了一个FPGA实现QPSK解调的任务,其中最重要的一步便是载波同步——Costas环技术的实现,老大也基于了一些思想上的指导。已经布置了好长时间了,不能让老大失望。

载波同步中的性能参数

  • 同步带(Hold range)
    在锁定状态下,缓慢地改变输入信号频率来增加固有频差,若环路随着频差增大而最终失锁,那么失锁时对应的最大固有频差成为同步带。
    同步带是环路可以维持静态相位跟踪的频偏范围,锁相环路在此范围内可以保持静态的条件稳定。同步带代表了锁相环的静态稳定极限。
  • 快捕带(Lock range)
    锁相环不经过跳周而达到锁定的最大固有频差称为快捕带。
  • 失锁带(Pull-out range)
    如果锁相环的输入信号的频率阶跃超过一定范围,那么锁相环将失锁,这个频率的范围称为失锁带。
  • 捕获带(Pull-in range)
    在锁相环初始时刻就处于失锁状态的情况下,环路最终能锁定的最大固有频差成为锁相环的捕获带。只要环路失锁时的频偏在这一范围里,环路总会再次锁定,但时间可能会很长。
  • 捕获时间(Pull-in time)
    环路从某个起始状态频差开始,经历周期跳跃达到频率锁定所需的时间。即初始频差在锁相环的捕获带内,锁相环从失锁状态到锁定状态所需的时间。
  • 快捕时间(Lock time)
    环路从某个起始状态频差开始,不经历周期跳跃达到频率锁定所需的时间。即初始频差在锁相环的快捕带内,锁相环从失锁状态到锁定状态所需的时间。

  • 环路前置带宽 $B_i$ 通常需要计算输入端叠加的高斯白噪声的带宽,即$N_0 B_i$

  • 环路单边噪声带宽 $B_L$
    对于理想二阶环,$B_L$的计算方法是:
    $$ B_L=\frac{\omega_n}{8\xi}(1+4\xi^2) $$

  • 环路自然角频率 $\omega_n$
    $\omega_n$的值越小,环路锁定时的信噪比条件越低,环路更容易在恶劣的条件下锁定,并且锁定之后的稳态相差越小。
    $\omega_n$的值越大,环路的快捕带越宽,捕获约迅速。

注:此节引用lifejustdoit的博客

参数的计算

  • 环路滤波器的系数
    $$ C_1 = \dfrac{2\xi\omega_n T}{K} $$
    $$ C_2 = \dfrac{(\omega_n T)^2}{K} $$
    其中环路自然角频率$\omega_n$
    $$ \begin{equation}\begin{split}
    \omega_n &= \dfrac{8\xi(S/N)_i B_i}{(S/N)_L(1+4\xi^2)}
    \end{split}
    \end{equation}
    $$

Costas环实现框图

环路滤波器模型

$$H(z)=C_1 + \dfrac{C_2 z^{-1}}{1-z^{-1}}$$

matlab 仿真

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
clear;clc
%% 设置参数
load('lpf.mat','Num');
fs = 50e6; %采样频率
sim_time = 0.05; %仿真时长
real_fc = 1000050; %实信号载波频
local_fc = 10000; %初始本地振荡频率
SampleBit_len = 8;
LocalBit_len = 8;
DDS_PhaseBit_len = 32;

C1 = power(2,-31);
C2 = power(2,-15);

t = 1 / fs : 1 / fs : sim_time;
sampled_data = sin(2 * pi * real_fc * t) ;
Data_length = length(sampled_data);

%变量申请空间
% DDS_CtrlWord= zeros(1,Data_length);
% DDS_Phase = zeros(1,Data_length);
% nco_cos = zeros(1,Data_length);
% nco_sin = zeros(1,Data_length);

t = power(2,DDS_PhaseBit_len);

% for k = 1 : Data_length - 1

% DDS_CtrlWord(k) = 1024;

% nco_sin(k) = sin(2 * pi * DDS_Phase(k) / t);

% nco_cos(k) = cos(2 * pi * DDS_Phase(k) / t);

% DDS_Phase(k+1) = DDS_Phase(k) + DDS_CtrlWord(k);

% end
% lpf_out_i = zeros(1,length(Num));
% lpf_out_q = zeros(1,length(Num));
mult_i = zeros(1,Data_length + length(Num));
mult_q = zeros(1,Data_length + length(Num));

DDS_Phase = 0;

figure;

for k = 1 : Data_length - 1

% DDS_CtrlWord = 1024;

nco_sin = sin(2 * pi * DDS_Phase / t) * power(2,LocalBit_len);

nco_cos = cos(2 * pi * DDS_Phase / t) * power(2,LocalBit_len);

mult_i(k + length(Num) - 1) = nco_sin * sampled_data(k);

mult_q(k + length(Num) - 1) = nco_sin * sampled_data(k);

lpf_out_i = mult_i(k + length(Num) - 1 : -1 : k) * Num';

lpf_out_q = mult_q(k + length(Num) - 1 : -1 : k) * Num';

PhaseDetect = lpf_out_i * lpf_out_q;

LoopFilter_out = PhaseDetect;

DDS_CtrlWord = LoopFilter_out;

DDS_Phase = DDS_Phase + DDS_CtrlWord;
end

Hello World

Posted on 2018-04-15

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

杂七杂八

Posted on 2016-02-26

引脚输入输出类型

  • 上拉/下拉输入
  • 浮空输入
  • 模拟输入模式·(应用于连接ADC模块)
  • 开漏输出
  • 推挽输出

开漏输出OD(集电极开路OC)

当集电极开路时的结构如同图一所示。由CPU软件控制左端的输入。正是由于右边的那个三极管集电极什么都不接,所以叫做集电极开路(左边三极管起到反相作用,使当输入为0时,输出也为“0”)。当左端的输入为0时,前面的三极管截至。所以5V电源通过1K电阻加到右边的三极管的基极,使右边的三极管导通(相当于开关闭合)。而当左端的输入为1时,左边的三极管导通,而右边的三极管此时会处于截止状态(相当于开关断开)。
这样图1就可以简化为图2 的样子,并且图中的开关收到软件的控制。很明显,当开关闭合时,输出接地,所以输出电平为0。而当开关断开的时候,输出端悬空,此即为高阻态。并且电平状态未知。
当开漏电路接上1k上拉电阻后(图3)。入股哦开关闭合

  • 可以利用外部电路的驱动能力,来减少IC内部的驱动(或者用来驱动比芯片电压高的负载)。

推挽输出

推挽输出的结构其实就是将图三的上拉电阻换成开关,这样当要输出高电平的时候,上面的开关导通,下面开关截至;当输出低电平时,正好相反。
这样的结构决定了推挽输出的高电平和低电平驱动能力都很强。当药设置为高阻态时 就需要两个开关都处于关闭状态。

quartus实现ram

Posted on 2016-01-19

最近课设利用FPGA做一个计时器,当然这么简单的课设实在是太恶心和无聊,那就加点料!来个记忆功能,就类似于市面上那种秒表可以计时每圈的时间一样。那这就得想办法在FPGA中综合出ram啦。

在实现过程中主要有两种方法,一种是利用quartus的LPM模块通过配置模块参数实现内置的LPM_ram模块,另外一种通过简单的自己手写的语句自己综合,但是注意自己直接写的话,最后综合可能使用的是FPGA中分布式的ram,也就是各LE中的寄存器模块,这样无疑会造成巨大的浪费,但无奈这样浅显易懂,更容易掌握LPM_RAM的工作方式。

先上一个简单的RAM 模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
module ram_1port(
input [3:0] address;
input clk,
input [23:0]data,
input wren,
output[23:0]q
)

reg[23:0] mem[7:0];

always @ (posedge clk) begin
if(wren)
mem[address] <= data;
end

assign q = mem[address];

endmodule

Qt学习笔记_helloQt

Posted on 2016-01-14 | In 学习笔记

STM32学习笔记_环境搭建和介绍

Posted on 2016-01-14 | In 学习笔记

ACM1月训练

Posted on 2016-01-14 | In ACM

期末反思

Posted on 2016-01-14 | In 湖芝麻糖

又考砸了T_T

hexo的搭建和使用

Posted on 2016-01-12 | In 湖芝麻糖

git的配置和使用

Posted on 2016-01-12 | In 湖芝麻糖

安装 msysgit 一路默认安装就好

接下来配置相关信息

1
2
$ git config --global user.name "zcatao"
$ git config --global user.email "yangsontao19950616@vip.qq.com"

1
ssh-keygen
1234

Songtao Yang

32 posts
9 categories
34 tags
© 2018 Songtao Yang
Powered by Hexo
|
Theme — NexT.Muse v5.1.4
0%