MPSK的模拟和理论BER/SER曲线研究(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客     

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

🌈4 Matlab代码实现


💥1 概述

MPSK MAPSK 信号都是数字通信中常见的调制信号, MAPSK 拥有比 MPSK更高的频谱效率,拥有比 QAM 更好的峰均比,更适合非线性信道。 APSK QAM调制类似,都是既调幅又调相的调制信号,而 PSK 是幅度恒定的调相信号,可以把 PSK 看作是 APSK QAM 的特例。因此这些信号的调制解调原理相近,解调方法可以通用。下面分别介绍 MPSK MQAM MAPSK 的信号模型,提取共同点形成统一的信号模型。
MPSK 调制信号的表达式如式 (2-1) 所示:

 本文 MPSK2 模拟 BPSK、QPSK、8PSK 和 16 PSK 以生成实验性 BER v Eb/No 和 SER v Es/No 曲线。还绘制了相应的理论曲线。

📚2 运行结果

 

部分代码:

while TotalNoBitErrors<1,
            % generate bit stream
            m=floor(rand(1,NoOfBitsPerWord).*2);
            % serial to parralel
            m1=reshape(m, k, NoofSymbolsPerWord);
            % do MPSK modulation
            s=zeros(1,length(m1));
            x1=zeros(1,length(m1)); % symbols in decimal label format
            % look-up for modulator
            for counter=1:length(m1),
                data=m1(1:k,counter)';
                for counter2=1:M,
                    if data== symbolmapping(counter2,2:end),
                        x1(counter)=symbolmapping(counter2,1);
                        s(counter)=exp(j.*2.*pi./M.*symbolmapping(counter2,1));
                    end
                end
            end
            % Create AWGN complex noise
            EbNo=10.^(EbNodBVals(SNR)./10);
            EsNo=EbNo.*coderate.*log2(M);
            Es=1;
            No=Es./EsNo;
            if M>2,
                sigma=sqrt(No./2);
            else
                sigma=sqrt(No./2);
            end
            n=sigma.*(randn(size(s))+j.*randn(size(s)));
            r=s+n; %awgn, r= received signal

            % Minimum squared Euclidean distance symbol-by-symbol demodulator
            x1_est=zeros(1,length(r)); % estimated symbols (decimal index)
            m1_est=zeros(k,length(r)); % estimated bit strean

            for counter=1:length(r),
                distances=abs(r(counter)-si).^2;
                I=find(distances==min(distances));
                x1_est(counter)=I(1)-1; % holds the symbol number 0 to M-1
                I=find(symbolmapping(:,1)==x1_est(counter));
                m1_est(:,counter)=(symbolmapping(I(1),2:end))';
            end
            % parralel to serial
            m_est=reshape(m1_est,1,k.*length(r)); % estimated bit stream
            TotalNoSymbolErrors=TotalNoSymbolErrors+length(find(x1_est~=x1));
            TotalNoBitErrors=TotalNoBitErrors+length(find(m~=m_est));
            TotalNoBits=TotalNoBits+NoOfBitsPerWord;
            TotalNoSymbols=TotalNoSymbols+NoofSymbolsPerWord;

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]孟庆松,段建红,黄子豪.基于LFM信号的MPSK水声信号盲解调[J].舰船电子工程,2022,42(04):74-78.

[2]胡乘龙. MPSK/MAPSK信号盲解调方法研究[D].电子科技大学,2021.DOI:10.27005/d.cnki.gdzku.2021.001118.

🌈4 Matlab代码实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是使用MATLAB画出MPSK和MFSK的误码率曲线代码和步骤。 1. MPSK的误码率曲线 首先,我们需要定义MPSK调制的信号,这里我们以8PSK为例。代码如下: ``` M = 8; % 8PSK调制 k = log2(M); % 每个符号的比特数 EbNo = 0:10; % 信噪比范围,单位dB numSymPerFrame = 10000; % 每帧中的符号数 data = randi([0 1],numSymPerFrame*k,1); % 随机产生比特流 dataSym = bi2de(reshape(data,k,length(data)/k).','left-msb')+1; % 比特流转换为符号 modSignal = pskmod(dataSym,M); % 使用8PSK进行调制 ``` 接着,我们可以使用AWGN信道模拟信道中的噪声和衰落。代码如下: ``` for i = 1:length(EbNo) snr = EbNo(i) + 10*log10(k) - 10*log10(2); % 计算信噪比 noiseVar = 1/(10^(snr/10)); % 计算噪声方差 noise = sqrt(noiseVar/2)*(randn(size(modSignal)) + 1i*randn(size(modSignal))); % 产生复高斯噪声 rxSignal = modSignal + noise; % 添加噪声 ``` 然后,我们可以使用demod函数对接收到的信号进行解调,并统计误码率。代码如下: ``` demodSignal = pskdemod(rxSignal,M); % 8PSK解调 errors = sum(dataSym~=demodSignal); % 统计误码数 errorRate(i) = errors/numSymPerFrame; % 计算误码率 end ``` 最后,我们可以使用semilogy函数画出误码率曲线。完整的MPSK误码率曲线代码如下: ``` M = 8; % 8PSK调制 k = log2(M); % 每个符号的比特数 EbNo = 0:10; % 信噪比范围,单位dB numSymPerFrame = 10000; % 每帧中的符号数 data = randi([0 1],numSymPerFrame*k,1); % 随机产生比特流 dataSym = bi2de(reshape(data,k,length(data)/k).','left-msb')+1; % 比特流转换为符号 modSignal = pskmod(dataSym,M); % 使用8PSK进行调制 for i = 1:length(EbNo) snr = EbNo(i) + 10*log10(k) - 10*log10(2); % 计算信噪比 noiseVar = 1/(10^(snr/10)); % 计算噪声方差 noise = sqrt(noiseVar/2)*(randn(size(modSignal)) + 1i*randn(size(modSignal))); % 产生复高斯噪声 rxSignal = modSignal + noise; % 添加噪声 demodSignal = pskdemod(rxSignal,M); % 8PSK解调 errors = sum(dataSym~=demodSignal); % 统计误码数 errorRate(i) = errors/numSymPerFrame; % 计算误码率 end semilogy(EbNo,errorRate,'-o'); % 画出误码率曲线 xlabel('Eb/No (dB)'); ylabel('Bit Error Rate'); % 添加坐标轴标签 title('MPSK Bit Error Rate Curve'); % 添加标题 ``` 2. MFSK的误码率曲线 对于MFSK,我们可以使用MATLAB的comm.FSKModulator和comm.FSKDemodulator对象进行调制和解调。代码如下: ``` M = 8; % MFSK调制中的调制阶数 k = log2(M); % 每个符号的比特数 EbNo = 0:10; % 信噪比范围,单位dB numSymPerFrame = 10000; % 每帧中的符号数 data = randi([0 1],numSymPerFrame*k,1); % 随机产生比特流 dataSym = bi2de(reshape(data,k,length(data)/k).','left-msb')+1; % 比特流转换为符号 % 创建MFSK调制器和解调器对象 fskMod = comm.FSKModulator(M); fskDemod = comm.FSKDemodulator(M); for i = 1:length(EbNo) snr = EbNo(i) + 10*log10(k) - 10*log10(2); % 计算信噪比 noiseVar = 1/(10^(snr/10)); % 计算噪声方差 noise = sqrt(noiseVar/2)*(randn(size(dataSym)) + 1i*randn(size(dataSym))); % 产生复高斯噪声 modSignal = step(fskMod,dataSym); % 进行MFSK调制 rxSignal = modSignal + noise; % 添加噪声 demodSignal = step(fskDemod,rxSignal); % 进行MFSK解调 errors = sum(dataSym~=demodSignal); % 统计误码数 errorRate(i) = errors/numSymPerFrame; % 计算误码率 end semilogy(EbNo,errorRate,'-o'); % 画出误码率曲线 xlabel('Eb/No (dB)'); ylabel('Bit Error Rate'); % 添加坐标轴标签 title('MFSK Bit Error Rate Curve'); % 添加标题 ``` 以上就是使用MATLAB画出MPSK和MFSK的误码率曲线的步骤和代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值