Matlab——通信原理小程序_求fsk信号功率谱-程序员宅基地

技术标签: matlab  2015总结  通信原理  

概述

通信原理课上老师布置的作业

  1. AM,DSB,SSB信号的功率谱计算及其相干解调
  2. 2ASK,2FSK,2PSK信号功率谱及这三种信号信噪比与误码率之间的关系

AM,DSB,SSB信号功率谱计算及其相干解调

%% 通信原理作业1
%% variable 
clc
clear all

A0=1;A1=1; A2=1;
dt=0.0001;  T=3; 
df=1/T; N=T/dt;
f=(-N/2:N/2-1)*df;
f1=1; w1=2*pi*f1;
f2=10; w2=2*pi*f2;
fc=f2; fs=1/dt;

x=0:dt:(T-dt);
y1=A1*sin(w1.*x);
y2=A2*cos(w2.*x);
%% m(t)  c(t)
figure(1)
subplot(2,1,1); plot(x,y1,'linewidth',1.5); grid on
title('m(t)');
subplot(2,1,2); plot(x,y2,'linewidth',1.5); grid on
title('c(t)');
figure(2)

%% AM
yAM=(A0+y1).*y2;                                 % AM 

pAM=fft(yAM); pAM=T/N*fftshift(pAM);  % fft&shift 
pAM=(abs(pAM).^2)/x(end);

subplot(2,3,1); plot(x,yAM); axis([x(1),x(N),1.2*min(yAM),1.2*max(yAM)]); grid on 
title('AM');
subplot(2,3,4); plot(f,pAM); axis([-1.5*f2,1.5*f2,0,max(pAM)]); grid on
title('功率谱');
%% DSB
yDSB=y1.*y2;                                 % DSB 

pDSB=fft(yDSB); pDSB=T/N*fftshift(pDSB);  % fft&shift 
pDSB=(abs(pDSB).^2)/x(end);

subplot(2,3,2); plot(x,yDSB);  axis([x(1),x(N),1.2*min(yDSB),1.2*max(yDSB)]); grid on 
title('DSB');
subplot(2,3,5); plot(f,pDSB); axis([-1.5*f2,1.5*f2,0,max(pDSB)]); grid on
title('功率谱');
%% SSB
ySSB=real(hilbert(y1).*exp(1i*2*pi*f2*x));

pSSB=fft(ySSB); pSSB=T/N*fftshift(pSSB);  % fft&shift 
pSSB=(abs(pSSB).^2)/x(end);

subplot(2,3,3); plot(x,ySSB);  axis([x(1),x(N),1.2*min(ySSB),1.2*max(ySSB)]); grid on 
title('SSB');
subplot(2,3,6); plot(f,pSSB); axis([-1.5*f2,1.5*f2,0,max(pSSB)]); grid on
title('功率谱');

demod_am=demod(yAM,fc,fs,'am');
demod_dsb=demod(yDSB,fc,fs,'amdsb-sc');
demod_ssb=demod(ySSB,fc,fs,'amssb');
%% 解调
figure(3)

subplot(3,1,1); plot(x,demod_am,x,y1,'r');grid on
title('AM相干解调')
subplot(3,1,2); plot(x,demod_dsb,x,y1,'r');grid on
title('DSB相干解调')
subplot(3,1,3); plot(x,demod_ssb,x,y1,'r');grid on
title('SSB相干解调')

2ASK,2FSK,2PSK信号功率谱及这三种信号信噪比与误码率之间的关系

%% 通信原理作业2
%% varibale
clc
clear all
close all

n=1000;n_display=10;
b=randint(1,n);
f1=1;f2=2; ffsk_neg=f2;
t=0:1/30:1-1/30;
dt=1/30;
T=n;
df=1/T; N=T/dt;
f=(-N/2:N/2-1)*df;

%% 方便根据信噪比计算误码率------将信号能量转化为单位能量
%% 2ASK
sa_pos=sin(2*pi*f1*t);
E1=sum(sa_pos.^2);
sa_pos=sa_pos/sqrt(E1); %
sa_neg=0*sin(2*pi*f1*t);
%% 2FSK
sf_neg=sin(2*pi*f1*t);
E=sum(sf_neg.^2);
sf_neg=sf_neg/sqrt(E);
sf_pos=sin(2*pi*f2*t);
E=sum(sf_pos.^2);
sf_pos=sf_pos/sqrt(E);
%% 2PSK
sp_neg=-sin(2*pi*f1*t)/sqrt(E1);
sp_pos=sin(2*pi*f1*t)/sqrt(E1);

%% 调制
ask_signal=[];psk_signal=[];fsk_signal=[];
for i=1:n
    if b(i)==1
        ask_signal=[ask_signal sa_pos];
        psk_signal=[psk_signal sp_pos];
        fsk_signal=[fsk_signal sf_pos];
    else
        ask_signal=[ask_signal sa_neg];
        psk_signal=[psk_signal sp_neg];
        fsk_signal=[fsk_signal sf_neg];
    end
end
%% 10个码元序列-----用于波形显示
figure(1)
subplot(4,1,1)
stairs(0:n_display,[b(1:n_display) b(n_display)],'linewidth',1.5)
axis([0 n_display -0.5 1.5]); grid on
subplot(4,1,2)
tb=0:1/30:10-1/30;
plot(tb, ask_signal(1:10*30),'b','linewidth',1.5)
title('2ASK');grid on
subplot(4,1,3)
plot(tb, fsk_signal(1:10*30),'r','linewidth',1.5)
title('2FSK');grid on
subplot(4,1,4)
plot(tb, psk_signal(1:10*30),'k','linewidth',1.5)
title('2PSK');grid on
%% 对全部码元序列计算PSD
figure(2) 
subplot(3,1,1)
pask_signal=(abs(T/N*fftshift(fft(ask_signal(1:T*30)))).^2)/T;
pfsk_signal=(abs(T/N*fftshift(fft(fsk_signal(1:T*30)))).^2)/T;
ppsk_signal=(abs(T/N*fftshift(fft(psk_signal(1:T*30)))).^2)/T;

subplot(3,1,1); plot(f,pask_signal,'linewidth',1.5);axis([-ffsk_neg*2,ffsk_neg*2,0,max(pask_signal)]);
title('2ASK 功率谱');grid on
subplot(3,1,2); plot(f,pfsk_signal,'linewidth',1.5);axis([-ffsk_neg*2,ffsk_neg*2,0,max(pfsk_signal)]);
title('2FSK 功率谱');grid on
subplot(3,1,3); plot(f,ppsk_signal);axis([-ffsk_neg*2,ffsk_neg*2,0,max(ppsk_signal)]);
title('2PSK 功率谱');grid on


%% 添加高斯白噪声计算误码率
biterror_ask=zeros(1,21);
biterror_fsk=zeros(1,21);
biterror_psk=zeros(1,21);
for snr=0:20
    askn=awgn(ask_signal,snr);
    pskn=awgn(psk_signal,snr);
    fskn=awgn(fsk_signal,snr);


    A = zeros(1,n);
    F = zeros(1,n);
    P = zeros(1,n);
    for i=1:n
        if sum(sa_pos.*askn(1+30*(i-1):30*i))>0.5  %相干解调和抽样判决,没有加带通滤波器
            A(i)=1;
        end
        if sum(sf_pos.*fskn(1+30*(i-1):30*i))>0.5
            F(i)=1;
        end
        if sum(sp_pos.*pskn(1+30*(i-1):30*i))>0
            P(i)=1;
        end
    end
    errA=0;errF=0; errP=0;
    for i=1:n
        if A(i)~=b(i)
            errA=errA+1;
        end
        if F(i)~=b(i)
            errF=errF+1;
        end
        if P(i)~=b(i)
            errP=errP+1;
        end
    end
    biterror_ask(snr+1)=errA/n;
    biterror_fsk(snr+1)=errF/n;
    biterror_psk(snr+1)=errP/n;
end
%%
figure(3)
semilogy(0:20,biterror_ask, 'b','linewidth',2)
%plot(0:20,biterror_ask, 'b','linewidth',2)
grid on;
hold on
semilogy(0:20,biterror_fsk,'r','linewidth',2)
semilogy(0:20,biterror_psk, 'k','linewidth',2)
title('biterror rate & S/N')
legend('ASK','FSK','PSK');

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011070641/article/details/50491411

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签