www.gusucode.com > 针对单音信号的科斯塔斯锁相环matlab仿真程序 > 针对单音信号的科斯塔斯锁相环matlab仿真程序/CostasExample1.m

    %% ************************************************************* %%
%                                                                       %
%                 科斯塔斯锁相环示例程序一:单音信号                       %
%                                                                       %
%% ************************************************************* %%
close all;
clear all;
clc;

%% 信号及锁相环参数
Fs    = 1e6;     % 采样率
F0    = 1e5;     % 信号载波
DetaF = 100;     % 本地时钟与信号载波的差,频差越大需要的锁相周期越小
Time  = 1;       % 信号总时长
snr   = 10;      % 信噪比
T     = 1e-3;    % 锁相周期,要求远小于1/DetaF

LoopN  = Time / T;        % 锁相次数
Len    = Fs*T;            % 每次锁相采用的采样点数
SigLen = Fs*Time;         % 信号总长
wfc    = 2*pi*(F0+DetaF); % 初始本振角频率
t      = 0:1/Fs:T-1/Fs;   % 各段锁相中的时间序列

RecSig = cos(2*pi*F0*(0:SigLen-1)/Fs);   % 接收端信号
RecSig = awgn(RecSig,snr);

% FFTSig = 20*log10(abs(fftshift(fft(RecSig))));
% figure(1),subplot(2,1,1);plot((-SigLen/2:SigLen/2-1)/SigLen*Fs,FFTSig);title('接收信号频谱');
% figure(1),subplot(2,1,2);plot(RecSig);title('接收信号时域波形');

%% 锁相:鉴相+环路滤波+VCO
c1    = 153.7130;   % 环路滤波器的参数
c2    = 6.1498;

phase = 0;
temp  = 0;

% 记录中间过程的数组
PhaseDiff    = zeros(1, LoopN);
FrqDiff      = zeros(1, LoopN);
TmpI         = zeros(1, LoopN);
TmpQ         = zeros(1, LoopN);
VCOIn        = zeros(1, LoopN);

for i = 1:LoopN
    % 产生本振参考信号:根据当前锁相后的角频率
    LoOsc  = exp(1j*(wfc*t+phase));
    sine   = imag(LoOsc);
    cosine = real(LoOsc);

    % 鉴相:输出本振与接收信号相位差
    % 1、接收信号与本地参考信号相乘
    x_sine   = RecSig((i-1)*Len+1:i*Len) .* sine;
    x_cosine = RecSig((i-1)*Len+1:i*Len) .* cosine;
    % 2、低通滤波+抽取(降低处理速率),滤波器为全1的门函数,对应频域为sa函数
    TmpI(i)      = sum(x_cosine);
    TmpQ(i)      = sum(x_sine);
    PhaseDiff(i) = atan2(TmpQ(i), TmpI(i)); % 得到锁相环的输入
    
    % 环路滤波器:产生VCO输入
    VCOIn(i) = c1 * PhaseDiff(i) + temp;    % c1*x(n)+c2*sum(x(1:n-1))
    temp = temp + c2 * PhaseDiff(i);
    
    % VCO
    wfc  = wfc - VCOIn(i) * 2 * pi;     % 改变本地频率
    FrqDiff(i) = wfc;                   % 记录频率变化
    phase = wfc * Len / Fs + phase;     % 得到不同块的相位
end
figure(3),plot(1:LoopN,FrqDiff/(2*pi),'b',1:LoopN,F0,'r');
legend('锁相环跟踪频率','实际的载波频率');title('锁相环锁定频率情况');


% figure(2),plot(1:LoopN,TmpI,'b',1:LoopN,TmpQ,'r');title('低通滤波后的鉴相信号');
% FFTSig = 20*log10(abs(fftshift(fft(TmpI + 1j*TmpQ))));
% figure(1),plot((-LoopN/2:LoopN/2-1)/LoopN/T,FFTSig);title('接收信号频谱');

% FFTSig = 20*log10(abs(fftshift(fft(PhaseDiff))));
% figure(1),subplot(2,1,1),plot((-LoopN/2:LoopN/2-1)/LoopN/T,FFTSig);title('接收信号频谱');

% temp = 0;
% for i = 1:LoopN
%     VCOIn(i) = c1 * PhaseDiff(i) + temp;    % c1*x(n)+c2*sum(x(1:n-1))
%     temp = temp + c2 * PhaseDiff(i);
% end
% FFTSig = 20*log10(abs(fftshift(fft(VCOIn))));
% figure(1),subplot(2,1,2),plot((-LoopN/2:LoopN/2-1)/LoopN/T,FFTSig);title('接收信号频谱');