原文链接:(更多文章移步链接)

贼详细的8PSK调制与解调详细过程 - 子木的文章 - 知乎 https://zhuanlan.zhihu.com/p/47258287

一、关于

1.花了几天写了一个8PSK调制的MATLAB程序,从产生序列到最后解调出原始信号。

2.我在网上查资料的时候发现并没有详细的一个调制完整过程,于是我把写的完整过程贴出来。

3.要想把通信专业学好的话,脑子里首先要有一个通信系统的全过程,从信源开始到信宿结束。但是在课本的系统框图中,有些模块在一般情况下并用不上。比如信道编码、信源编码、加密、解密等等。在本篇仿真过程中不涉及这几个模块,等有时间再额外写。而且在实际中又会涉及到源信息频率与发射设备所支持的频率不一致,这又如何解决?

4.通信专业要学的真是太多了,想总结出来十分困难,在实现通信系统的每一步都涉及到很多技术,如采样、滤波、调制、同步(非常重要,但又十分难)、解调等等,而且还挺难,因为经历过这个过程,所以在本文中,尽量把涉及到的原理都解释一下。

 

5.其实这个过程很简单,主要是加深对通信系统的了解。

 

6.、、、、、、还不知道6写啥

二、程序中未涉及到但是不得不知的一些知识点

1. matlab信号处理工具规定单位频率为奈圭斯特频率(采样频率的一半),所以基本的滤波器设计函数的截止频率参数均以奈圭斯特频率为基准做归一化。例如,对于一个采样频率为1000Hz的系统,300Hz则对应300/500=0.6。若要将归一化频率转换为单位圆上的弧度,则将归一化值乘以π(pi)即可。

 

2. 尽量对基带信号进行编码(本文使用的格雷码),对解决误比特率问题效果很好,在仿真过程中未编码之前百分之3左右,编码后为0。

 

3. 数字通信系统中,由于总的传输特性不理想,会使传输波形产生畸变,会引起幅度失真和相位失真,表现为连续传输的脉冲波形会受到破坏,使得接收端前后脉冲不再能清晰的分开,也就是产生了码间串扰。时域中,抽样时刻***间串扰的条件为,抽样时刻仅存在当前码元的抽样值,不存在历史时刻码元抽样值的加权值。

在实际的传输系统中,很少利用方波作为基带脉冲波形,因为基带脉冲波形的功率谱形状为 Sa(f)形状,旁瓣功率大,容易对其他频带产生干扰, 也容易失真。这就需要对基带脉冲进行成型,来压缩带宽,但是由于压缩了带宽必然会带来时域信号的延长,这是无可避免的。 奎斯特第一准则告诉我们,理想成型滤波器是矩形成型滤波器,它是物理无法实现的,但我们并不为此感到失望,因为其频率响应没有过渡带,这导致了其冲击响应为 Sa(t)形式,拖尾严重,在位定时信息不精准的情况下,会引入较大的码间串扰值。

在实际中最常用的成型滤波器为升余弦成型滤波器,它具有平滑的特性,拖尾幅度较小, 可以使得在对当前码元抽样时,免受码元串扰值的影响,同时在位定时不精准的情况下,由抽样引入的码间串扰值减小,增加了系统的可靠性,但滚降因子越大,会造成调制之后的信噪比(SNR)降低。为了降低滤波器的设计复杂度,升余弦成型滤波器的设计通常设计为匹配滤波器,也就是在发射端设置一个均方根升余弦滤波器,接收端同样地设置一个均方根升余弦滤波器,接收端的均方根升余弦滤波器的频率响应为发射端的共轭。在基带通信系统中,在满足***间串扰的条件下,经过理想成型的频带利用率和经过升余弦程序的频带利用率的极值分别为: 2(Baud/Hz/s)和 2/(1+a)(Baud/Hz/s)。其中a为滚降因子。

 

4. 升余弦滤波器:

b = rcosdesign(beta,span,sps,shape)

beta: 滚降系数,取值0~1之间,决定频宽和陡峭程度。取值一般大于0.2。

span: 表示截断的符号范围。

sps: 单个符号范围的采样个数。

shape:可选参数。可不加,可加上'normal',可加上'sqrt'。

当选择'sqrt'时,返回一个平方根升余弦滤波器。

使用示例:

d = 2 * randi([0 1], 20, 1) - 1;
h = rcosdesign(rolloff,span,sps);
x=conv(d,h,'same');

 

5. 低通滤波器

fir1是用窗函数法设计线性相位FIRDF的工具箱函数,以实现线性相位FIRDF的标准窗函数法设计。

b=fir1(n,wn);

b=fir1(n,wn,'ftype');

b=fir1(n,wn,'ftype',window);

%b为滤波器系数,n为滤波器阶数,wn为截止频率,当指定ftype时,可设计高通和带阻滤波器。ftype=high时设计高通,低通和带通无需输入ftype。

程序中使用的是y_de7=fir1(127,1/10);

使用示例:

y_de7=fir1(127,1/10);
sit_1600k_f=conv(sit_1600k,y_de7,'same');

至于如何设计滤波器,这里不赘述,可以看看其他篇。

 

6.成形滤波、匹配滤波器、均衡滤波器

是什么呢?作用是干嘛的?

6.1 成形滤波:

1.作用是保证采样点不失真。如果没有它,那信号在经过带限信道后,眼图张不开,ISI非常严重。

2.位置在基带调制之后在载波调制之前,仅挨着载波调制

3.总之,一般是用的升余弦滤波器,就是在基带信号产生后用,参考程序食用。

6.2 匹配滤波器

1.目标:在存在高斯白噪声的条件下使已知信号的信噪比最大。

 

2.适用于具有任意参数(如振幅、到达时间)的已知信号,可以看作与信号的已知形状匹配的模板。

 

3.一般滤波器的目标是尽量保持有用信号的时域或频域结构,而匹配滤波器则通过集中与之相匹配的信号能量来改变信号的时间结构,并在输出码元的末端获得振幅最大值。

 

4.实现:用输入信号与参考信号相关,选出匹配程度最大的信号。

6.3 均衡滤波器

1.作用是保证采样点不失真。如果没有它,那信号在经过带限信道后,眼图张不开,ISI非常严重。

 

2.位置在基带调制之后在载波调制之前,仅挨着载波调制

6.4 带通滤波器

6.5 低通滤波器

 

7. MATLAB提供了非常多的函数,多了解了解,能省去不少事。具体看看程序中使用的。

 

三、通信系统框图以及相应的原理

1.完整的通信系统框图

一个完整的通信系统框图,圆框中的一般用不上

2. 8PSK调制的框图

8PSK调制的框图

2.1 首先8PSK需要3bit来表示,按照格雷码的顺序,分别映射到坐标中的8个点,如下图:

将每个码元映射到8PSK星座图的每一个相位点上,既得到对应的I路和Q路信号,即x、y轴坐标。如(0 0 0)对应的坐标就是(0.924 0.383)

然后坐标  可以写成复数形式  。于是:

2.2 调制原理:

看出来了吗,这样就将载波函数利用上了,在调制过程中只要I路和Q路的信号分别去乘再相加就解决了。注意sin函数前面有个负号。

2.3 解调原理

只要把已调信号再乘一遍载波,得到上式,看到了吗,如果在经过一个低通滤波器,就可以把原信号滤出来了。不过要注意系数这里除以2 ,在程序中乘以2 就解决了。

四、 如何改变采样频率

在实际中可能涉及到源信号的频率与发射设备不匹配的问题。比如我源信息的频率是16k但是发射设备支持的频率是250M,这就需要对信号的采样率进行调整。即抽取和插值。

1.1 抽取

(为什么先滤波再抽取 ,先插值再滤波?时间有限,可看看书上这一部分)???????

1.1.1先滤波再抽取

时域中研究

h(n)为一理想低通滤波器:

滤波后的输出为:

对v(n)抽取后的序列为y(n) :

 

频域中研究

在(-π/M~π/M)内, 抽取后信号的频谱与原信号频谱只是幅度相差M倍

1.1.2 画图理解

将x(n)中每M个点中抽取一个,依次组成一个新的序列y(n),即:

y(n)和x(n)的DTFT有如下关系:

含意:将信号x(n)作M倍的抽取后,所得信号y(n)的频谱等于原信号x(n)的频谱先作M倍的扩展,再在ω轴上每隔  作移位后再迭加。

抽样之前,保证f(s)>2f(c);就可以保证信号不发生混叠!对于抽样之后的系统,只要保证f(s)>2Mf(c),同样系统也不会发生混叠现象。

注意:若M是可变的,为防止抽取后在出现混迭,应对x(n)抽取前先作低通滤波,压缩其频带。

1.2 插值(先插值再滤波)

1.2.1 画图理解插值

将x(n)中每两个点之中补L-1个0,组成一个新的序列v(n),即:

插零后的信号及其频谱:

插零后信号的频谱V(jω)在(-π/L~π/L)内等于X(ejω),相当于将X(ejω)作了周期压缩。换句话说,就是V(jω)在(-π~π)内包含了L个X(jω)的压缩样本。

1.2.2 先插值再滤波

频域中研究

实际实现插值的方法是用v(n)和一低通滤波器作卷积 :

所以应取c=L以保证y(n)=x(n/L) 。

时域中研究

注意:插值时补进来的零,不再是零此时再进行低通滤波,无非是想将我们的信号频谱恢复出来

3.3 抽取与插值相结合的抽样率转换

注意滤波器的使用和位置

该滤波器既去除了插值后的映像又防止了抽取后的混迭。

五、贴程序(具体看注释,仿真图就不放了,图太多)

%% 8PSK 基本参数

clc
clear all
close all
Fc=700e6;%Fc载波频率

%% 基带信号

data_num=300;
data = randint(1,data_num); %产生1行300列的矩阵,元数为0-1之间的随机数,包括0和1
figure(1)
subplot(211)
plot(data);title('原始基带信号')%以data分量为纵坐标,以元素序号为横坐标,用直线依次连接数据点,绘制曲线
ts=0:1:length(data)-1;
subplot(212)
stem(ts,data);title('原始基带信号');%“有时间向量的话,序列是冲激”

%% 8psk调制

fs_16k=16e3;%假设最开始采样频率是16e3
it=[];qt=[];
sit=[];sqt=[];
for i=1:3:length(data)
    I(i) = data(i); 
    Q(i+1) = data(i+1);
    U(i+2) = data(i+2);   
    if I(i)==0 && Q(i+1)==0 && U(i+2)==0
        it=0.924*ones(1,1);%1行1列的全为1的矩阵
        qt=0.383*ones(1,1);
       
    elseif I(i)==0 && Q(i+1)==0 && U(i+2)==1
        it=0.383*ones(1,1);
        qt=0.924*ones(1,1);
       
    elseif I(i)==0 && Q(i+1)==1 && U(i+2)==1
        it=-0.383*ones(1,1);
        qt=0.924*ones(1,1);
       
    elseif I(i)==0 && Q(i+1)==1 && U(i+2)==0
        it=-0.924*ones(1,1);
        qt=0.383*ones(1,1);
     
    elseif I(i)==1 && Q(i+1)==1 && U(i+2)==0
        it=-0.924*ones(1,1);
        qt=-0.383*ones(1,1);
      
    elseif I(i)==1 && Q(i+1)==1 && U(i+2)==1
        it=-0.383*ones(1,1);
        qt=-0.924*ones(1,1); 
        
    elseif I(i)==1 && Q(i+1)==0 && U(i+2)==1 
        it=0.383*ones(1,1);
        qt=-0.924*ones(1,1);
       
    elseif I(i)==1 && Q(i+1)==0 && U(i+2)==0
        it=0.924*ones(1,1);
        qt=-0.383*ones(1,1);
       
    end
   sit=[sit it]; sqt=[sqt qt];
end %映射
figure(2)
subplot(221)
plot(sit);title('i路信号')
subplot(222)
plot(sqt);title('q路信号')
subplot(223)
plot(-fs_16k/2:fs_16k/length(sit):fs_16k/2-fs_16k/length(sit),fftshift(abs(fft(sit))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图')
subplot(224)
plot(-fs_16k/2:fs_16k/length(sqt):fs_16k/2-fs_16k/length(sqt),fftshift(abs(fft(sqt))));
xlabel('Frequency(Hz)');
title('Q路频谱图')

figure(3)
scatter(sit,sqt);%星座图
grid on

%% 提高采样频率16k-160k,(插值:先插后滤,抽取:先抽后滤)

fs_160k=160e3;
sit_160k=upsample(sit,10);
sqt_160k=upsample(sqt,10);

beta=0.4;%r=0时是矩形
span=length(sit_160k);
sps=10;
h = rcosdesign(beta,span,sps);
sit_160k_f=conv(sit_160k,h,'same');
sqt_160k_f=conv(sqt_160k,h,'same');

figure(4)
subplot(221)
plot(sit_160k_f);title('10倍插值i路')
subplot(222)
plot(sqt_160k_f);title('10倍插值q路')
subplot(223)
plot(-fs_160k/2:fs_160k/length(sit_160k_f):fs_160k/2-fs_160k/length(sit_160k_f),fftshift(abs(fft(sit_160k_f))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(升余弦)')
subplot(224)
plot(-fs_160k/2:fs_160k/length(sqt_160k_f):fs_160k/2-fs_160k/length(sqt_160k_f),fftshift(abs(fft(sqt_160k_f))));
xlabel('Frequency(Hz)');
title('Q路频谱图(升余弦)')

%% 160k-1600k,插值:先插后滤,抽取:先抽后滤

fs_1600k=1600e3;
sit_1600k=upsample(sit_160k_f,10);
sqt_1600k=upsample(sqt_160k_f,10);

y_de7=fir1(127,1/10);
sit_1600k_f=conv(sit_1600k,y_de7,'same');
sqt_1600k_f=conv(sqt_1600k,y_de7,'same');

figure(5)
subplot(221)
plot(sit_1600k_f);title('100倍插值i路')
subplot(222)
plot(sqt_1600k_f);title('100倍插值q路')
subplot(223)
plot(-fs_1600k/2:fs_1600k/length(sit_1600k_f):fs_1600k/2-fs_1600k/length(sit_1600k_f),fftshift(abs(fft(sit_1600k_f))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_1600k/2:fs_1600k/length(sqt_1600k_f):fs_1600k/2-fs_1600k/length(sqt_1600k_f),fftshift(abs(fft(sqt_1600k_f))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)');

%% 1600k-16M,插值:先插后滤,抽取:先抽后滤

fs_16M=16e6;
sit_16M=upsample(sit_1600k_f,10);
sqt_16M=upsample(sqt_1600k_f,10);

y_de7=fir1(127,1/10);
sit_16M_f=conv(sit_16M,y_de7,'same');
sqt_16M_f=conv(sqt_16M,y_de7,'same');

figure(6)
subplot(221)
plot(sit_16M_f);title('1000倍插值i路')
subplot(222)
plot(sqt_16M_f);title('1000倍插值q路')
subplot(223)
plot(-fs_16M/2:fs_16M/length(sit_16M_f):fs_16M/2-fs_16M/length(sit_16M_f),fftshift(abs(fft(sit_16M_f))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_16M/2:fs_16M/length(sqt_16M_f):fs_16M/2-fs_16M/length(sqt_16M_f),fftshift(abs(fft(sqt_16M_f))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)');

%% 16M-25M,由于原始采样频率与信道传输需要的采样频率不一致,故需要变频。

fs_25M=25e6;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
sit_25M=resample(sit_16M_f,25,16);
sqt_25M=resample(sqt_16M_f,25,16);

figure(7)
subplot(221)
plot(sit_25M);title('25/16倍插值i路')
subplot(222)
plot(sqt_25M);title('25/16倍插值q路')
subplot(223)
plot(-fs_25M/2:fs_25M/length(sit_25M):fs_25M/2-fs_25M/length(sit_25M),fftshift(abs(fft(sit_25M))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_25M/2:fs_25M/length(sqt_25M):fs_25M/2-fs_25M/length(sqt_25M),fftshift(abs(fft(sqt_25M))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 25M-250M

fs_250M=250e6;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
sit_250M=upsample(sit_25M,10);
sqt_250M=upsample(sqt_25M,10);

y_de7=fir1(127,1/10);
sit_250M_f=conv(sit_250M,y_de7,'same');
sqt_250M_f=conv(sqt_250M,y_de7,'same');

figure(8)
subplot(221)
plot(sit_250M_f);title('10倍插值i路')
subplot(222)
plot(sqt_250M_f);title('10倍插值q路')
subplot(223)
plot(-fs_250M/2:fs_250M/length(sit_250M_f):fs_250M/2-fs_250M/length(sit_250M_f),fftshift(abs(fft(sit_250M_f))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_250M/2:fs_250M/length(sqt_250M_f):fs_250M/2-fs_250M/length(sqt_250M_f),fftshift(abs(fft(sqt_250M_f))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 带通调制

fs_250M=250e6;
T=length(sqt_250M_f);%T=
t=0 : 1/fs_250M :T/fs_250M - 1/fs_250M;%fs = 100
% c=exp(j*2*pi*Fc*t);	%载波信号,Fc=70e6
c1=cos(2*pi*Fc*t);	%同相载波
c2=-sin(2*pi*Fc*t);	%正交载波	
psk8 = sit_250M_f.*c1 + sqt_250M_f.*c2;
figure(9),
% subplot(221);plot(t,c);title('载波信号')
subplot(221);plot(t,c1);title('同相载波')
subplot(222);plot(t,c2);title('正交载波')
subplot(223);plot(t,psk8);	title('已调信号')
subplot(224);
plot(-fs_250M/2:fs_250M/length(psk8):fs_250M/2-fs_250M/length(psk8),fftshift(abs(fft(psk8))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('已调信号频谱图')

%% 解调

fs_250M=250e6;
rit_250M_de=2*psk8.*c1;
rqt_250M_de=2*psk8.*c2;
y_de7=fir1(127,1/10);
rit_250M_f=conv(rit_250M_de,y_de7,'same');
rqt_250M_f=conv(rqt_250M_de,y_de7,'same');
figure(10)
subplot(221)
plot(rit_250M_f);title('I路解调信号')
subplot(222)
plot(rqt_250M_f);title('Q路解调信号')
subplot(223)
plot(-fs_250M/2:fs_250M/length(rit_250M_f):fs_250M/2-fs_250M/length(rit_250M_f),fftshift(abs(fft(rit_250M_f))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路解调信号频谱图(低通)')
subplot(224)
plot(-fs_250M/2:fs_250M/length(rqt_250M_f):fs_250M/2-fs_250M/length(rqt_250M_f),fftshift(abs(fft(rqt_250M_f))));
xlabel('Frequency(Hz)');
title('Q路解调信号频谱图(低通)')

%% 250M-25M,插值:先插后滤,抽取:先滤后抽

fs_25M=25e6;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
y_de7=fir1(127,1/10);
rit_250M_f1=conv(rit_250M_f,y_de7,'same');
rqt_250M_f1=conv(rqt_250M_f,y_de7,'same');

rit_25M=downsample(rit_250M_f1,10);
rqt_25M=downsample(rqt_250M_f1,10);

figure(11)
subplot(221)
plot(rit_25M);title('10倍抽取i路')
subplot(222)
plot(rqt_25M);title('10倍抽取q路')
subplot(223)
plot(-fs_25M/2:fs_25M/length(rit_25M):fs_25M/2-fs_25M/length(rit_25M),fftshift(abs(fft(rit_25M))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_25M/2:fs_25M/length(rqt_25M):fs_25M/2-fs_25M/length(rqt_25M),fftshift(abs(fft(rqt_25M))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 25M-16M,插值:先插后滤,抽取:先滤后抽

fs_16M=16e6;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
% y_de7=fir1(127,1/10);
% rit_25M_f=conv(rit_25M,y_de7,'same');
% rqt_25M_f=conv(rqt_25M,y_de7,'same');

rit_16M=resample(rit_25M,16,25);
rqt_16M=resample(rqt_25M,16,25);

figure(12)
subplot(221)
plot(rit_16M);title('10*25/16倍抽取i路')
subplot(222)
plot(rqt_16M);title('10*25/16倍抽取q路')
subplot(223)
plot(-fs_16M/2:fs_16M/length(rit_16M):fs_16M/2-fs_16M/length(rit_16M),fftshift(abs(fft(rit_16M))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_16M/2:fs_16M/length(rqt_16M):fs_16M/2-fs_16M/length(rqt_16M),fftshift(abs(fft(rqt_16M))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 16M-1600k,插值:先插后滤,抽取:先滤后抽

fs_1600k=1600e3;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
y_de7=fir1(127,1/10);
rit_16M_f=conv(rit_16M,y_de7,'same');
rqt_16M_f=conv(rqt_16M,y_de7,'same');

rit_1600k=downsample(rit_16M_f,10);
rqt_1600k=downsample(rqt_16M_f,10);

figure(13)
subplot(221)
plot(rit_1600k);title('10倍抽取i路')
subplot(222)
plot(rqt_1600k);title('10倍抽取q路')
subplot(223)
plot(-fs_1600k/2:fs_1600k/length(rit_1600k):fs_1600k/2-fs_1600k/length(rit_1600k),fftshift(abs(fft(rit_1600k))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_1600k/2:fs_1600k/length(rqt_1600k):fs_1600k/2-fs_1600k/length(rqt_1600k),fftshift(abs(fft(rqt_1600k))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 1600k-160k,插值:先插后滤,抽取:先滤后抽

fs_160k=160e3;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。
y_de7=fir1(127,1/10);
rit_160k_f=conv(rit_1600k,y_de7,'same');
rqt_160k_f=conv(rqt_1600k,y_de7,'same');

rit_160k=downsample(rit_160k_f,10);
rqt_160k=downsample(rqt_160k_f,10);

figure(14)
subplot(221)
plot(rit_160k);title('10倍抽取i路')
subplot(222)
plot(rqt_160k);title('10倍抽取q路')
subplot(223)
plot(-fs_160k/2:fs_160k/length(rit_160k):fs_160k/2-fs_160k/length(rit_160k),fftshift(abs(fft(rit_160k))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_160k/2:fs_160k/length(rqt_160k):fs_160k/2-fs_160k/length(rqt_160k),fftshift(abs(fft(rqt_160k))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 160k-16k,插值:先插后滤,抽取:先滤后抽

fs_16k=16e3;
%resample为信号降采样处理,理解如下:B=resample(x,90,250); 
% 采样从250Hz降到90Hz,如果250在前,就是插值从90到250,可以看B的长度,250Hz采样4000个数据等于90hz采样1440个数据,这就是降采样。

y_de7=fir1(127,1/10);
rit_160k_f=conv(rit_160k,y_de7,'same');
rqt_160k_f=conv(rqt_160k,y_de7,'same');

rit_16k=downsample(rit_160k_f,10);
rqt_16k=downsample(rqt_160k_f,10);

figure(15)
subplot(221)
plot(rit_16k);title('10倍抽取i路')
subplot(222)
plot(rqt_16k);title('10倍抽取q路')
subplot(223)
plot(-fs_16k/2:fs_16k/length(rit_16k):fs_16k/2-fs_16k/length(rit_16k),fftshift(abs(fft(rit_16k))));
xlabel('Frequency(Hz)');
ylabel('Amp');
title('I路频谱图(低通)')
subplot(224)
plot(-fs_16k/2:fs_16k/length(rqt_16k):fs_16k/2-fs_16k/length(rqt_16k),fftshift(abs(fft(rqt_16k))));
xlabel('Frequency(Hz)');
title('Q路频谱图(低通)')

%% 星座图

figure(16)
scatter(rit_16k,rqt_16k);
grid on

%% 8psk解调

fs_16k=16e3;
rt=[ ];
rt1=[ ];  

for m=1:length(rit_16k)/100:length(rit_16k)
    II(m) = rit_16k(m); 
    QQ(m) = rqt_16k(m);

    if II(m)<0 && QQ(m)<0 && QQ(m)<II(m)
      rt=[1 1 1];%7
       
    elseif II(m)<0 && QQ(m)<0 && QQ(m)>II(m)
     rt=[1 1 0];%6
             
	elseif II(m)>0 && QQ(m)<0 && abs(QQ(m))>II(m)
     rt=[1 0 1];%5
       
    elseif II(m)>0 && QQ(m)<0 && abs(QQ(m))<II(m)
     rt=[1 0 0];%4
       
    elseif II(m)<0 && QQ(m)>0 && abs(II(m))<QQ(m)
       rt=[0 1 1];%3
       
    elseif II(m)<0 && QQ(m)>0 && abs(II(m))>QQ(m)
       rt=[0 1 0];%2
       
    elseif II(m)>0 && QQ(m)>0 && II(m)>QQ(m)
       rt=[0 0 0];%0
       
    elseif II(m)>0 && QQ(m)>0 && II(m)<QQ(m)
       rt=[0 0 1];%1
       
    end
   rt1=[rt1 rt];
end 
figure(17),
subplot(211)
plot(rt1);title('解调出的基带信号')%以data分量为纵坐标,以元素序号为横坐标,用直线依次连接数据点,绘制曲线
subplot(212)
ts=0:1:length(rt1)-1;
stem(ts,rt1);title('解调出的基带信号');

%% 误比特率

k=0;
for i=1:length(data)
    if(data(i)==rt1(i))
        k=k;
    else
        k=k+1;
    end
end
rate1=k/length(data);
fprintf('误比特率=%f',rate1);

注:

1.在上面这段程序中是没有经过信道的,那么如何达到让它经过信道的效果呢,就是在已调信号上加上一个加性高斯白噪声即可。就模拟了经过信道受到干扰的过程。

2. 可以自己尝试着去加上高斯白噪声试试。需要那一段程序的就留言吧。我写了两份,有噪声的那一份在优盘里,忘带了。

 

六、最后

1.如果本文对你有所帮助,就点个赞吧,给点动力,大家一起努力。

2.想着尽量写清楚一点,但是深入进去,内容很多,有些地方跳过了,如果哪里不清楚欢迎指出。

3.欢迎指正。