MFSK调制方式的频谱效率,误码率,频谱等matlab仿真

发布时间 2023-05-07 18:17:53作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

 

 

 

2.算法涉及理论知识概要

        数字信号传输系统分为基带传输系统和频带传输系统.频带传输系统也叫数字调制系统。数字调制信号又称为键控信号,数字调制过程中处理的是数字信号,而载波有振幅、频率和相位3个变量,且二进制的信号只有高低电平两个逻辑量10,所以调制的过程可用键控的方法由基带信号对载频信号的振幅、频率及相位进行调制,最基本的方法有3种:正交幅度调制(QAM)、频移键控(FSK)、相移键控(PSK).根据所处理的基带信号的进制不同分为二进制和多进制调制(M 进制).多进制数字调制与二进制相比,其频谱利用率更高。

 

       MFSK系统是2FSK(二频键控)系统的推广,该系统有M个不同的载波频率可供选择,每一个载波频率对应一个M进制码元信息,即用多个频率不同的正弦波分别代表不同的数字信号,在某一码元时间内只发送其中一个频率。MFSK信号可表示为:

 

 

 

       为载波角频率,通常采用相位不连续的振荡频率,这样便于利用合成器来提供稳定的信号频率。图1 MFSK系统的原理框图。在发送端,输入的二进制码元经过逻辑电路和串/并变换电路转换为M进制码元,每k位二进制码分为一组,用来选择不同的发送频率。在接收端,当某一载波频率到来时,只有相应频率的带通滤波器能收到信号,其它带通滤波器输出的都是噪声。抽样判决器的任务就是在某一时刻比较所有包络检波器的输出电压,通过选择最大值来进行判决。将最大值输出就得到一个M进制码元,然后,再经过逻辑电路转换成k位二进制并行码,再经过并/串变换电路转换成串行二进制码,从而完成解调过程。

 

 

 

 

 

 

 

 

3.MATLAB核心程序

 

for i=1:length(data)
    tSym = (i-1)*symDur:Ts:(symDur*i);% symbol duration
    tmp = cos(2*pi*tSym* freqs(data(i)+1));%%modulate data with corresponding frequency
    mod = [mod tmp];%append the symbol duration to complete signal
    subplot(2,1,2);plot(tSym,tmp,'color', colors(data(i)+1,:));
    title("Modulated Signal @TX");xlabel('Time');ylabel("Amplitude[V]")
    hold on; axis([0 tSym(end) -2 2]);
    hold on
end
 
F = linspace(-fs/2,fs/2, numel(mod));%frequency range for plotting
t = linspace(0,numel(data),numel(mod));%time range for plotting
fft_TX = fftshift(abs(fft(mod)));
fft_TX = 1/numel(fft_TX)*fft_TX;%Mag spectrum of signal
figure;
plot(F,fft_TX);title("Mag. Spectrum of Signal @TX");xlabel('Freq. [Hz]');ylabel("Magnitude[V]")
 
 
figure;
noisy_sig = awgn(mod,-2,'measured');%pass signal through awgn ch.
subplot(2,1,1);plot(t,noisy_sig);title("FSK Signal @RX");xlabel('Time');ylabel("Amplitude[V]")
 
fft_NO = fftshift(abs(fft(noisy_sig)));
fft_NO = 1/numel(fft_NO)*fft_NO;%spectrum @ RX
subplot(2,1,2);plot(F,fft_NO);title("Mag. Spectrum of Signal @RX");
xlabel('Freq. [Hz]');ylabel("Magnitude[V]")
 
n_sym=numel(data);
n_mod=numel(mod); 
sPerSymb = n_mod/n_sym;%sample per symbol
n_freqs=numel(freqs)
correlator = zeros(n_sym,n_freqs);%preallocation for demoding
%each row is repsenting period for one symbol
%columns are representing the correlator output for a freq in a sym period
 
for i=1:n_sym
    tSym = (i-1)*symDur:Ts:(symDur*i);
    for j=1:n_freqs
        out = noisy_sig((i-1)*sPerSymb+1:i*sPerSymb).*cos(2*pi*tSym* freqs(j));
        %multiplying with cos waves at expected freqs in above line
        correlator(i,j) = trapz(tSym,out);
        %integrating multiplied signal and inserting to a matrix
    end
end