⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shi2007_2_1.m

📁 滤波器设计.rar matlab 带有滤波器系数,已经在matlab上测试通过.
💻 M
字号:
% 差分解调延时的长度为一个原始信息bit长度
% 对解调数据进行符号判决,然后在对1bit内的数据求和过门限比较
% 针对不同的信噪比测试误码率
clear all
close all
clc

%-------------------------------控制信号&全局变量---------------------------%
loop_time = 12;     % 测试次数
NOISE_COF = zeros(loop_time,1); % 每次测试的信噪比大小
for snr_i = 1:loop_time
    NOISE_COF(snr_i) = sqrt(0.5*10^(-(-5.5 + (snr_i-1)*0.5)/10));
end
noise_ctrl = 1;    % 噪声控制:1表示-受噪声影响,其他值表示不受噪声影响
fd_ctrl = 1;       % 频偏控制信号,1表示在正负30KHz内的随机变量,其他表示固定值
threshold = 3.95;   % 判决门限,仿真显示为3.95
FFT_NUM = 512;     % FFT算法就算用到的采样点数
% MAG_ctrl = 0;      % 信号幅度控制:1表示在给定区间随机取值,其他值表示固定值
phase_ctl = 0;     % 1表示0到2pi的随机相位,其他值表示固定初始相位
kp_ctrl = 0;       % 同步头之后扩频方式控制:1表示64chip扩1bit,其他值表示32chip扩1bit 
f0 = 70*1000000;   % 射频端的载波信息,70MHz
fs = 40*1000000;   % AD采样频率,40MHz
w0=2*pi*f0;        % 射频载波角频率   
END_POINT=20;      % 设置每次捕获结束位置:当第20个接收点数据来到而
                   % FFT(20:20+512)未出现极值时,认为捕获失败
if(kp_ctrl == 1)
    kp_mode = 64;   % 扩频模式选择
else
    kp_mode = 32;
end

if (fd_ctrl == 1) % 频偏控制
    fd = rem(15*randn(1),30);  % 随机产生频偏,范围在-30KHz到30KHz内
else
    fd = 0;                     % 固定初相
end
% fd =-30*1000;%rem(15*randn(1),30);       % 固定频偏   
wd = 2*pi*fd;

if (phase_ctl == 1) % 70MHz载波的初始相位控制
    ini_phase=0.5*pi*rem(randn(1),2);  % 随机产生初始相位,范围在-pi到pi内
else
    ini_phase=0;                       % 固定初相
end

MAG = 0.00393118;  % 未扩频数据的幅度,工程幅度值为:sqrt(0.00002~0.2)
%-------------------------------信息数据是PN码的前620chip--------------------------%
data_original_len = 1200;
PN_len = 640 + (data_original_len-5)*kp_mode;
filename='m.txt'; fid=fopen(filename,'r'); 
PN=fscanf(fid,'%d',PN_len);
Data_original = PN(1:data_original_len); fclose(fid);   

%------------------------------对原始数据进行扩频--------------------------%
DATA_SS = zeros(640+kp_mode*(data_original_len-5),1) ;
for i = 1:data_original_len
   if(i<=5)
     DATA_SS((i-1)*128+1:i*128) = Data_original(i)*PN((i-1)*128+1:i*128); %前5个bit:5*128
   else
     DATA_SS(641+(i-6)*kp_mode:640+(i-5)*kp_mode) = Data_original(i)*PN(641+(i-6)*kp_mode:640+(i-5)*kp_mode); 
   end
end

% 产生本地的伪码信息,每个伪码重复四次,以便与发端采样数据匹配  
PN_LOCAL = zeros(PN_len*4,1);
for i=1:PN_len
    PN_LOCAL((i-1)*4+1:i*4)=PN(i);
end
samp_len = PN_len*4;
t=0:1/fs:(samp_len-1)/fs;   % 采样间隔,40MHz时钟周期
%产生发射端的载波信号
data_psk=zeros(samp_len,1); 
y=cos((w0+wd)*t+ini_phase); % 70MHz中频载波40MHz采样后序列(载波包含频偏)  
for AD_i = 1:PN_len
    data_psk((AD_i-1)*4+1:AD_i*4)=MAG*DATA_SS(AD_i)*y((AD_i-1)*4+1:AD_i*4);
end

% 带通滤波器的设计
% fsamp = 40*1000000;        % 采样频率为40MHz
% fcuts = [(10-1)*1000000 (10-0.35)*1000000 (10+0.35)*1000000 (10+1)*1000000 ];
% mags = [0 1 0];
% devs = [0.01 0.05 0.01];
% [n_cof,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
% n_cof = n_cof + rem(n_cof,2);
filename='cof.txt'; fid=fopen(filename,'r'); 
cof_band = fscanf(fid,'%e');
fclose(fid);   

% %===========================================================================================%
% %------------------------------开始循环模拟,以判断算法的正确性-------------------------------%
% %===========================================================================================%
% max_i = zeros(loop_time,1);
% sub_max_i = zeros(loop_time,1);
catch_point = zeros(loop_time,1);
for loop_i=1:loop_time %开始多次循环,完成解扩解调判决 
    noise = NOISE_COF(loop_i)*MAG*randn(length(data_psk)+16,1);
    data_AD_noise = data_psk+noise(1:length(data_psk));  
    % 产生噪声部分(50采样点)和受噪声影响的信号部分
    data_samp=[ noise(length(data_psk)+1:length(data_psk)+16) 
                data_AD_noise];%前16个点表示随机噪声,噪声后面为扩频数据
% %=================================================% 
% %---------------------------------------对数据进行捕获---------------------------------------%
% %===========================================================================================%
    DATA_JK = zeros(512,1);
    % 进行第一次的伪码捕获与判决,伪码相位差恒定,但是FFT计算的数据彼此差一个采样数据,以便减少噪声的影响
    for JK_START=1:END_POINT 
        % 扩频码相位不变,数据依次输入进行解扩后捕获PN码同步
        for samp_i = JK_START:JK_START+FFT_NUM-1
            DATA_JK(samp_i-JK_START+1)=PN_LOCAL(samp_i-JK_START+1)*data_samp(samp_i);
        end
      
      % 重叠叠加法进行FFT_NUM/2点的FFT,
      % 找到最大值,并找到第1第FFT_NUM/4+1点及最大值周边的FFT_NUM/8点中的次大值,下同
      FFT_RESULT_11=abs(fft(DATA_JK(1:FFT_NUM/2))).^2+...
                    abs(fft(DATA_JK(FFT_NUM/2+1:FFT_NUM))).^2+...
                    abs(fft(DATA_JK(FFT_NUM/4+1:FFT_NUM*3/4))).^2; % 计算512点FFT的功率谱
      big_11 = FFT_RESULT_11(65); 
      middle_11=max([FFT_RESULT_11(1) FFT_RESULT_11(FFT_NUM/4+1)...
                     max(FFT_RESULT_11(FFT_NUM/16+1:FFT_NUM/8-1))...
                     max(FFT_RESULT_11(FFT_NUM/8+3:FFT_NUM*3/16))]);  
      div = big_11/middle_11;
      if(div>=threshold)
          catch_point(loop_i)=JK_START;
          break;
      end
    end
    %---------------------------------解扩解调---------------------------------%
    % 对整个采样数据进行解扩
    DATA_JK_all = zeros(samp_len,1); % samp_len不包含无数据的噪声部分
    for i = catch_point(loop_i):samp_len+catch_point(loop_i)-1
        DATA_JK_all(i-catch_point(loop_i)+1)=PN_LOCAL(i-catch_point(loop_i)+1)*data_samp(i);
    end 
    % 对解扩后的数据带通滤波,滤出噪声部分,仅剩下基带
    DATA_JK_FILTER = filter(cof_band,1,DATA_JK_all);

    % 对滤波后的数据进行差分解调,延迟单位为一个bit的基带数据
              %-------------------差分解调----------------------%
    dem_len = samp_len-kp_mode*4;
    dem = zeros(dem_len,1);
    for dem_i = 1:dem_len
        dem(dem_i)=DATA_JK_FILTER(dem_i)*DATA_JK_FILTER(dem_i+kp_mode*4);
    end
    cof_lowpass = fir1(32,0.1);
    dem_filter = filter(cof_lowpass,1,dem); 
    dem_filter_adj = dem_filter > 0;
    dem_conv = zeros(dem_len,1);
    for conv_i = 1:dem_len
        if(dem_filter_adj(conv_i)>0)
            dem_conv(conv_i) = 1;
        else
            dem_conv(conv_i) = -1;
        end
    end
           %---------------------判决输出---------------------%
    data_adj = zeros(data_original_len,1);
    for adjuge_i = 1:data_original_len-20
        if(adjuge_i<=5)
            if(sum(dem_conv(85+adjuge_i*512-kp_mode*4+1:85+adjuge_i*512))>=kp_mode)
                data_adj(adjuge_i) = 0;
            elseif(sum(dem_conv(85+adjuge_i*512-kp_mode*4+1:85+adjuge_i*512))<=-kp_mode)
                data_adj(adjuge_i) = 1;
            end
        else
            if(sum(dem_conv(85+2560+(adjuge_i-6)*kp_mode*4:85+2560+(adjuge_i-5)*kp_mode*4))>=kp_mode)
                data_adj(adjuge_i) = 0;
            elseif(sum(dem_conv(85+2560+(adjuge_i-6)*kp_mode*4:85+2560+(adjuge_i-5)*kp_mode*4))<=-kp_mode)
                data_adj(adjuge_i) = 1;
            else
                data_adj(adjuge_i) = -1;
            end
        end
    end
    %将解调结果输出到文件 
    switch loop_i
        case 1
            filename = 'F:\DSSS\DEM\dem_-5.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
        case 2
            filename = 'F:\DSSS\DEM\dem_-5.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
        case 3
            filename = 'F:\DSSS\DEM\dem_-4.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 4
            filename = 'F:\DSSS\DEM\dem_-4.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 5
            filename = 'F:\DSSS\DEM\dem_-3.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 6
            filename = 'F:\DSSS\DEM\dem_-3.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 7
            filename = 'F:\DSSS\DEM\dem_-2.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 8
            filename = 'F:\DSSS\DEM\dem_-2.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 9
            filename = 'F:\DSSS\DEM\dem_-1.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 10
            filename = 'F:\DSSS\DEM\dem_-1.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 11
            filename = 'F:\DSSS\DEM\dem_-0.5dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
            case 12
            filename = 'F:\DSSS\DEM\dem_-0.0dB.txt';
            fid = fopen(filename,'w');
            fprintf(fid,'%d\n',data_adj);
            fclose(fid); 
    end
end
    
    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -