2FSK matlab模拟实现

就是最简单的实现一个2FSK,先不管这种调制方法的性质
其实就是太懒了不想学
代码如下,最后仿真的结果是用电脑播放随机二进制序列的调制信号,不建议带耳机听,建议小声听

Rb=100;%设定码元速率
sample=randBinary(N);%生成随机二进制序列

%设定发送波形参数
f1=8000;
f0=12000;
%发送波形采样
fs=48000;
send=modulation_2FSK(sample,[f0 f1],Rb,fs);

%发送
sound(send,fs);
plot(send);

附:
自定义函数说明:
产生随机二进制序列

function [ seq ] = randBinary( N )
%   输入需要生成序列的长度N
%   产生一个随机01序列,长度为N
%
%   如生成一个长度为1000的随机二进制序列
%   sample=randBinary(1000);

    seq=zeros(1,N);
    for i=1:N
        ele=ceil(rand()*10);
        seq(i)=mod(ele,2);
    end

end


对单极性不归零序列进行2FSK调制
采用键控法,码元为1或0时将发送其映射的波形

function [ send ] = modulation_2FSK( sample,f,Rb,fs )
%   2FSK调制
%   输入待调制的单极性不归零序列sample和码元速率Rb
%   发送频率[f0 f1]
%   fs为发送信号的播放频率
%   返回要发送的信号,播放时长为一秒
    
    Tb=1/Rb;
    Ts=1/fs;
    temp=[0];
    send=[0];
    
    N=length(sample);
    for i=1:N
        temp=i*Tb:Ts:(i+1)*Tb-Ts/10;
        if sample(i)
            send=[send cos(2*pi*f(2)*temp)];
        else
            send=[send cos(2*pi*f(1)*temp)];
        end
    end
    send=send(2:end);

end


然后是对接收信号进行解调.以下为解调的超理想模式,信道完全无噪声无衰减!其实根本没传输
因为没有噪声不用提取载波,只要对信号平方在通过lpf即可恢复序列

function [ ] = demodulation_2FSK( rcv,f,fs )
%   2FSK解调函数
%   输入接收信号rcv和发送频率[f0 f1]
%   fs为接收信号的采样频率
%   输出恢复01序列(暂无),显示抽样判决前波形

    Ts=1/fs;
    len=length(rcv);
    t=0:Ts:(len-1)*Ts;
    %恢复载波
    aid1=cos(2*pi*f(2)*t);
    aid0=cos(2*pi*f(1)*t);
    
    %定义滤波器(Fpass=500,Fstop=2k)
    lpf=[-0.000155833996394978,-8.13831647659670e-05,-9.20002718367755e-05,-9.34081381696587e-05,-8.07905288388760e-05,-4.82295684201173e-05,1.10503665725242e-05,0.000104811978995989,0.000241591960167609,0.000430822839276432,0.000682264219483239,0.00100598263039256,0.00141205216632109,0.00191075149567522,0.00251102822992922,0.00322157539693270,0.00404950826762152,0.00500032696122431,0.00607774423655064,0.00728301069263170,0.00861503729572713,0.0100699084385198,0.0116408437704915,0.0133180094004704,0.0150886733499124,0.0169371703821178,0.0188450158385386,0.0207913578208965,0.0227530878451301,0.0247053521313381,0.0266220811202588,0.0284763137354778,0.0302410586230369,0.0318896464873665,0.0333964895832343,0.0347376010424772,0.0358912330554356,0.0368383387237662,0.0375630659622750,0.0380532056874610,0.0383003706934961,0.0383003706934961,0.0380532056874610,0.0375630659622750,0.0368383387237662,0.0358912330554356,0.0347376010424772,0.0333964895832343,0.0318896464873665,0.0302410586230369,0.0284763137354778,0.0266220811202588,0.0247053521313381,0.0227530878451301,0.0207913578208965,0.0188450158385386,0.0169371703821178,0.0150886733499124,0.0133180094004704,0.0116408437704915,0.0100699084385198,0.00861503729572713,0.00728301069263170,0.00607774423655064,0.00500032696122431,0.00404950826762152,0.00322157539693270,0.00251102822992922,0.00191075149567522,0.00141205216632109,0.00100598263039256,0.000682264219483239,0.000430822839276432,0.000241591960167609,0.000104811978995989,1.10503665725242e-05,-4.82295684201173e-05,-8.07905288388760e-05,-9.34081381696587e-05,-9.20002718367755e-05,-8.13831647659670e-05,-0.000155833996394978];
    %滤除高频部分,保留低频分量
    rcv1=filter(lpf,1,rcv.*aid1);
    rcv0=filter(lpf,1,rcv.*aid0);
    %归一化
    rcv1=rcv1/max(abs(rcv1));
    rcv0=rcv0/max(abs(rcv0));
    
    figure
    plot(t,abs(rcv1),'-r');
    grid on
    hold on
    plot(t,abs(rcv0),'-g');
    title('接受恢复');xlabel('秒/s');
    legend('1接收','0接收')

end


在解调的过程中,我们要注意由于信道的随机衰减,可能导致针对某部分频谱分量的大量衰减,从而不能分辨.为了应对这种情况,我们就需要对经过lpf后的信号进行归一化,从而消除因幅度不同而导致的误差.不能在接收信号后就进行归一化,因为信号中只有部分频率分量是衰减的,对整个信号进行归一化后并不能使衰减信号恢复到正常值.

发布了161 篇原创文章 · 获赞 170 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/white_156/article/details/102981002