基于Matlab的2PSK信号gui界面制作

目录

1、熟悉2psk信号

2、2PSK的调制

3、2PSK的解调

4、2PSK调制与解调gui界面设计

5、结果

6、代码链接


1、熟悉2psk信号

        2PSK(全称:二进制相移键控)是相移键控的最简单的一种形式,它用两个初相相隔为180的载波来传递二进制信息。所以也被称为BPSK。

        相移键控是利用载波的相位变化来传递数字信息,而振幅和频率保持不变。

        2PSK信号的时域表达式为:

                                                ​​​​​​​        ​​​​​​​        e_{2psk}(t)=Acos(\omega _{c}t+\varphi _{n})

        其中,\varphi _{n} 表示第n个符号的绝对相位:

        \varphi _{n}=\left\{\begin{matrix} 0 &0 \\ \pi & 1 \end{matrix}\right.

                                                         图一:2PSK信号 

 如图一所示,表示信号的两种码元的波形相同,但极性相反。

2、2PSK的调制

        简单理解2psk信号的公式,我们可以发现只需要设定好A的值,按照2PSK的信号公式,即可模拟出2psk信号。

a=round(rand(1,10));%原始数字信号  round 四舍五入取整
 
g1=a;g2=~a;
%c=(ones(1,2000))                           (11111111)   *   (0101010)
g11=(ones(1,2000))'*g1;     %抽样  ones生成行为1列为2000元素都为1的矩阵   10*2000的矩阵
g1a=g11(:)';                %1*20000的矩阵,相当于采集20000个点,在频率2000的信号下采集20000个点,相当于10倍的来奎斯特采样
g21=(ones(1,2000))'*g2;%抽样
g2a=g21(:)';

figure(1)
subplot(321),plot(a);title('原始数据'),ylabel('数字信号');
subplot(322),plot(g1);title('g1'),ylabel('g1');
subplot(323),plot(g2);title('g2'),ylabel('g2');
subplot(324),plot(g1a);title('抽样1'),ylabel('');
subplot(325),plot(g2a);title('抽样2'),ylabel('');

        如上代码所示,a通过一个rand随机数获取到10个0-1范围内的数值并四舍五入为0或1,可在matlab的工作区内查看a的数值,即设定好A值。之后再进行抽样提取,按拉奎斯特定律为确保信号抽样的准确性,最小在2倍信号频率下采样,数据图像如下:

                                                        图二:原始数据及采样结果

         如图二所示,采样出来的图像在原始数据为0的时候出现0->1(或1->0)的变化。

t=0:dt:10-dt;  %10-dt 维度不同,画图会错  长度    0 dt 2dt .... ndt 10-dt
t1=length(t);  %返回数据维度  t1=20000

psk1=g1a.*cos(2*pi*f*t);%码元0用0相位
psk2=g2a.*cos(2*pi*f*t+pi);
sig_psk=psk1+psk2;              %产生2psk信号

figure(2)
subplot(311),plot(psk1);title('psk1'),ylabel('');
subplot(312),plot(psk2);title('psk2'),ylabel('');
subplot(313),plot(sig_psk);title('sig_psk'),ylabel('');

        如上代码所示,t=0:dt:10-dt,dt为采样时间(1/2000),因为数据从0开始取数,为保证数据维度的相同(长度),所以需要减一个dt,数据维度不一样时Matlab将会报错。到处2psk信号的调制已经完成。2psk调制结果如下图:

                                                         图三:2psk信号调制

            从图三可以明显的看出在0和1之间有重叠的部分,也就是相位相差\pi,码元分别为0和1的结果。

3、2PSK的解调

       (1)模拟信号在信道传输过程中叠加噪声的过程

        信号在通过信道传输的过程中,噪声会对信号产生影响,叠加在原始信号上,所以需要先模拟附加噪声的2psk信号。

A = 1;           %A为噪音幅度,越大噪音越大
noise=A*randn(1,t1);%噪声  0.01 * randn(1,t1) 
sn=sig_psk+noise;  %噪声进入信道

figure(3)
subplot(311),plot(t,noise);title('噪声波形'),ylabel('幅度');
subplot(312),plot(t,sig_psk);title('2 psk信号波形'),ylabel('幅度');
subplot(313),plot(t,sn);title('经过信道后的信号'),ylabel('幅度');

        这里的A为噪声的强度,强度越大表示噪声对信号的影响也越大,当噪声强度过大时,信号将被“淹没”在噪声中,为后面信号的解调增添难度。

                                                   图四:噪声强度为1时2psk信号

                                                  图五:噪声强度为10时的2psk信号

        当噪声强度为10时,可以从2psk的解调结果中看出,噪声过大导致的解调失败:

                                                  图六:噪声过大导致解调失败

        经测试A设置在1以下,解调出的信号结果更加“清晰”,到此模拟信号通过信号叠加噪声的过程就完成了。

        (2)2psk信号的解调

        解调过程分为两部分,一是通过滤波器先给噪声进行滤除,二是进行解调。 

%解调
bpf=fir1(101,[19/1000,41/1000]);%带通滤波器设置  wp1~wp2之间为通带 0~ws1和ws2到无穷为阻带 101是滤波器的阶数  
H=filter(bpf,1,sn);%经过带通滤波后的信号 分子为bpf、分母为1的函数,对sn输入函数进行滤波
sw=H.*cos(2*pi*f*t); %解调

lpf=fir1(101,[1/1000,10/1000]);%低通滤波器设置
st=filter(lpf,1,sw);

figure(4)
subplot(211),plot(bpf);title('带通'),ylabel('');
subplot(212),plot(lpf);title('低通'),ylabel('');

        fir1是设置滤波器的函数,第一个参数为滤波器的阶数,第二个参数为滤波器的工作范围,通过一个带通和低通滤波器后,信号结果为:

                                                         图七:滤波器输出结果

        (3)抽样判决

        从图七可以看出大致的信号波形(由于修改噪声强度,原始信号改变),但是这个波形存在一定的杂波,为解决这个问题就需要抽样判决。

%抽样判决
sig=zeros(1:t);         %创建全0矩阵 维度1行t列  t长度  1->20000
for i=1:length(t)  %20000
    if(st(i)<0)
        sig(i)=0;
    else
        sig(i)=1;
    end
end
figure(6)
subplot(211),plot(sig),axis([0 20000 0 2]),title('经过抽样判决后解调出的波形'),ylabel('幅度');
subplot(212),plot(g1a),axis([0 20000 0 2]),title('原始信号'),ylabel('幅度');

        经过抽样判决后,数据输出就是矩形波,如图所示:

                                                                图八:抽样判决结果

4、2PSK调制与解调gui界面设计

        gui界面需要在matlab的命令行窗口中键入guide,即可进入gui的设置界面。

                                                     图九:gui创建界面

         创建完gui界面后,  在左侧的工具内,我们需要按钮、坐标轴、可编辑文本、静态文本四种。

                                                        图十:2psk-gui界面 

        将上述四种部件如图所示放置(参照个人喜好,位置无所谓,清晰明了即可),其中axes为坐标轴部件,1000、0.25为可编辑文本,刷新为按钮,噪声强度为静态文本。放置完成后保存,Matlab就会生成对应的.m文件。

        (1)在function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)初始执行函数

% --- Executes just before untitled1 is made visible.
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)  %界面打开就会执行的功能
global a 
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled1 (see VARARGIN)

% Choose default command line output for untitled1
handles.output = hObject;

a=round(rand(1,10));%原始数字信号  round 四舍五入取整
plot(handles.axes1,a,'r--');        %red  -- 虚线  - 实线
legend(handles.axes1,'data');

% Update handles structure
guidata(hObject, handles);
% UIWAIT makes untitled1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);

       这个函数是程序运行就会执行的代码,我们可以将a(原始数据)的随机生成代码写入并通过global全局变量的形式将a传递给其他函数使用,这样就可以防止在修改采样频率和噪声强度的过程中原始数据也随之改变的情况,能更加清晰有效的进行对比。

        (2)在function pushbutton7_Callback(hObject, eventdata, handles)按键回调函数中

% --- Executes on button press in pushbutton7.
function pushbutton7_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton7 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
global variable a
variable = str2num(handles.edit3.String);  %2000
A = str2num(handles.edit4.String);         %0.5

%cla(handles.axes1,'reset');
cla(handles.axes2,'reset');
cla(handles.axes3,'reset');
cla(handles.axes4,'reset');
cla(handles.axes5,'reset');
cla(handles.axes6,'reset');
cla(handles.axes7,'reset');
cla(handles.axes8,'reset');

fs=variable;%采样频率
dt=1/variable;%采样时间
T=1;%码元宽度
f=20;%信号频率

g1=a;g2=~a;
g11=(ones(1,fs))'*g1;     %抽样  ones生成行为1列为2000元素都为1的矩阵   10*2000的矩阵
g1a=g11(:)';                %1*20000的矩阵,相当于采集20000个点,在频率2000的信号下采集20000个点,相当于10倍的来奎斯特采样
g21=(ones(1,fs))'*g2;%抽样
g2a=g21(:)';
plot(handles.axes2,g2a,'r-');
legend(handles.axes2,'samp');

t=0:dt:10-dt;
t1=length(t);  %返回数据维度  t1=20000

psk1=g1a.*cos(2*pi*f*t);%码元0用0相位
psk2=g2a.*cos(2*pi*f*t+pi);
sig_psk=psk1+psk2;%产生2psk信号
plot(handles.axes3,sig_psk,'b--');  %blue
legend(handles.axes3,'2psk');

%A = 1;           %A为噪音幅度,越大噪音越大
noise=A*randn(1,t1);%噪声  0.01 * randn(1,t1) 
sn=sig_psk+noise;
plot(handles.axes4,sn,'b-');
legend(handles.axes4,'noise');

bpf=fir1(101,[19/1000,31/1000]);%带通滤波器设置  wp1~wp2之间为通带 0~ws1和ws2到无穷为阻带  10_20  25_45
H=filter(bpf,1,sn);             %经过带通滤波后的信号 分子为bpf、分母为1的函数,对sn输入函数进行滤波
sw=H.*cos(2*pi*f*t);
lpf=fir1(101,[1/1000,10/1000]); %低通滤波器设置   80-120  8~15
st=filter(lpf,1,sw);

plot(handles.axes5,H,'m--');
legend(handles.axes5,'bpf');%带通输出
plot(handles.axes6,sw,'m-');
legend(handles.axes6,'mtp');%乘法器输出
plot(handles.axes7,st,'k--');
legend(handles.axes7,'lpf');

%抽样判决
sig=zeros(1:t);         %创建全0矩阵 维度1行t列
for i=1:length(t)
    if(st(i)>0)
        sig(i)=0;
    else
        sig(i)=1;
    end
end
plot(handles.axes8,sig,'k-');
legend(handles.axes8,'sampling');

        函数名称是对应gui界面中按钮的名称,这里我没有修改,自己操作时名称可能不太一样。首先将可编辑文本框内的字符串转换成数值型,然后将除原始数据的其他图像全部reset(清除),这样能进行重复刷新的操作。代码详解见上述2PSK的调制和解调。

5、结果

(1)采样频率1000,噪声0.25结果

 (2)采样频率1000,噪声1的结果

 (3)采样频率2000,噪声1的结果

 (4)采样频率2000,噪声10的结果

         从上述四者对比可知,当采样频率一定,噪声强度过大时,解调信号结果将出现杂乱无章的情况,噪声强度越低,经滤波器输出的信号杂波越少。

6、代码链接

链接:https://pan.baidu.com/s/1O4rHsCnvszXlBVTnAvyfPg?pwd=ljhq 
提取码:ljhq

上述过程比较繁琐,如遇到一些问题,欢迎联系“逆流”,我将尽力为你解决,欢迎欢迎!

qq:3125201632  备注:逆流

有任何问题,可在评论区评论,我将及时回复。

clear all; close all; clc; max=10 g=zeros(1,max); g=randint(1,max);%长度为max的随机二进制序列 cp=[];mod1=[];f=2*2*pi;t=0:2*pi/199:2*pi; for n=1:length(g); if g(n)==0; A=zeros(1,200);%每个值200个点 else g(n)==1; A=ones(1,200); end cp=[cp A]; %s(t),码元宽度200 c=cos(f*t);%载波信号 mod1=[mod1 c];%与s(t)等长的载波信号,变为矩阵形式 end figure(1);subplot(4,2,1);plot(cp);grid on; axis([0 200*length(g) -2 2]);title('二进制信号序列'); cm=[];mod=[]; for n=1:length(g); if g(n)==0; B=ones(1,200);%每个值200个点 c=cos(f*t); %载波信号 else g(n)==1; B=ones(1,200); c=cos(f*t+pi); %载波信号 end cm=[cm B]; %s(t),码元宽度200 mod=[mod c]; %与s(t)等长的载波信号 end tiaoz=cm.*mod;%e(t)调制 figure(1);subplot(4,2,2);plot(tiaoz);grid on; axis([0 200*length(g) -2 2]);title('2PSK调制信号'); figure(2);subplot(4,2,1);plot(abs(fft(cp))); axis([0 200*length(g) 0 400]);title('原始信号频谱'); figure(2);subplot(4,2,2);plot(abs(fft(tiaoz))); axis([0 200*length(g) 0 400]);title('2PSK信号频谱'); %带有高斯白噪声的信道 tz=awgn(tiaoz,10);%信号tiaoz中加入白噪声,信噪比为10 figure(1);subplot(4,2,3);plot(tz);grid on axis([0 200*length(g) -2 2]);title('通过高斯白噪声信道后的信号'); figure(2);subplot(4,2,3);plot(abs(fft(tz))); axis([0 200*length(g) 0 400]);title('加入白噪声的2PSK信号频谱'); jiet=2*mod1.*tz;%同步解调 figure(1);subplot(4,2,4);plot(jiet);grid on axis([0 200*length(g) -2 2]);title('相乘后信号波形') figure(2);subplot(4,2,4);plot(abs(fft(jiet))); axis([0 200*length(g) 0 400]);title('相乘后信号频谱'); %低通滤波器 fp=500;fs=700;rp=3;rs=20;fn=11025; ws=fs/(fn/2); wp=fp/(fn/2);%计算归一化角频率 [n,wn]=buttord(wp,ws,rp,rs);%计算阶数和截止频率 [b,a]=butter(n,wn);%计算H(z) figure(4);freqz(b,a,1000,11025);subplot(2,1,1); axis([0 4000 -100 3 ]) title('LPF幅频相频图'); jt=filter(b,a,jiet); figure(1);subplot(4,2,5);plot(jt);grid on axis([0 200*length(g) -2 2]);title('经低通滤波器后信号波形') figure(2);subplot(4,2,5);plot(abs(fft(jt))); axis([0 200*length(g) 0 400]);title('经低通滤波器后信号频谱'); %抽样判决 for m=1:200*length(g); if jt(m)=0; jt(m)=0; end end figure(1);subplot(4,2,6);plot(jt);grid on axis([0 200*length(g) -2 2]);title('经抽样判决后信号s^(t)波形') figure(2);subplot(4,2,6);plot(abs(fft(jt))); axis([0 200*length(g) 0 400]);title('经抽样判决后信号频谱');
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值