【本科生通信原理】【实验报告】【北京航空航天大学】实验四:模拟信号的数字化及编码

本文主要是介绍【本科生通信原理】【实验报告】【北京航空航天大学】实验四:模拟信号的数字化及编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 一、实验目的
    • 二、实验内容
    • 三、实验程序
    • 四、实验结果
    • 五、实验分析
    • 六、参考文献

一、实验目的

1、掌握低通信号的抽样重建过程;
2、掌握PCM编码译码过程。

二、实验内容

2问:
在这里插入图片描述在这里插入图片描述

三、实验程序

1、

function q1()
dt = 0.001;  % 时间分辨率
t = -8 * pi : dt : 8 * pi;  % 时间向量
x_t = cos(0.15 * pi * t) + sin(2.5 * pi * t) + cos(4 * pi * t);  
% 低通信号
[f, x_f] = F(t, x_t);
fs = 4;  % 采样速率
sdt = 1 / fs;  % 采样间隔
t1 = -8 * pi : sdt : 8 * pi;
st = cos(0.15 * pi * t1) + sin(2.5 * pi * t1) + cos(4 * pi * t1);  
% 采样信号
[f1, sf] = F(t1, st);% 恢复原始信号
t2 = -50 : dt : 50;
gt = sinc(fs * t2);
stt = sigexpand(st, sdt / dt);
xt_t = conv(stt, gt);  % 恢复信号
t3 = -50 : dt : 60 + sdt - dt;figure;  % 画出该低通信号的波形
plot(t, x_t);
xlabel('t/s');
ylabel('x(t)');
title('低通信号x(t)的波形');
grid on;
axis([-8 * pi 8 * pi -3 3]);figure;  % 画出抽样序列,抽样速率为4Hz
plot(t1, st);
xlabel('t/s');
ylabel('x_s(t)');
title('抽样速率为4Hz的抽样序列');
grid on;
axis([-8 * pi 8 * pi -2.5 2.5]);figure;  % 画出抽样序列恢复出的原始信号
plot(t3, xt_t(1 : length(t3)));
xlabel('t/s');
ylabel('x\^(t)');
title('抽样序列恢复出的原始信号');
axis([0 50 -2.5 2.5])
grid on;

2、

function q2()
dt = 0.001; % 时间分辨率
t = -4 * pi : dt : 4 * pi;  % 时间向量
xt = sin(2 * pi * t);  % 低通信号
fs = 20;  % 采样频率
sdt = 1 / fs; % 采样间隔
t1 = -4 * pi : sdt : 4 * pi;  % 采样时间向量
st = sin(2 * pi * t1);  % 采样信号ct = [];
Dt = [];
for i = 1 : length(t1)  % 对每一个采样点进行迭代mt = st(i) / 1 * 4096;  % 转化为量化电平bt = pcm_encode(mt);  % 进行pcm编码ct = cat(2, bt, ct);dt = pcm_decode(bt, 1);  % 进行pcm解码Dt(i) = dt;
end
c1 = [];
for j = 1 : 50if ct(j) == 0c = zeros(1, 20);elseif ct(j) == 1c = ones(1, 20);endc1 = [c1 c];
endfigure;  % 画出未编码波形
plot(t1, st);
xlabel('t/s');
ylabel('x_s(t)');
title('未编码波形');
grid on;
axis([-4 * pi 4 * pi -1 1]);figure;  % 画出PCM编码后的波形
plot(t1, c1(1 : length(t1)));
xlabel('t/s');
ylabel('PCM(t)');
title('经过PCM编码的波形');
grid on;
axis([-12 10 -0.1 1.1]);figure;  %画出译码后的波形
plot(t1, Dt);
xlabel('t/s');
ylabel('x\^(t)');
title('译码后的波形');
grid on;
axis([-4 * pi 4 * pi -1 1]);function q2_2()
cnt = -70 : 1 : 0;
for i = 1 : length(cnt)Ac = 10 ^ (cnt(i) / 20);  % dB的转换r(i) = PCM(Ac);
end
plot(cnt, 10 * log10(r));
grid on;
xlabel('A_c^2/A_0^2');
ylabel('r/dB');
title('量化信噪比与SNR的关系曲线');
end

程序中用到的子函数:

1、

function [f, sf] = F(t, st)
%利用fft, fftshift定义函数F计算信号的傅里叶变换
%t-离散时间
%st-离散信号
dt = t(2) - t(1); %时间分辨率
T = t(end);
df = 1 / T; %频率分辨率
N = length(st); %离散傅里叶变换长度
f = -N / 2 * df : df : N / 2 * df - df;
sf = fft(st);
sf = T / N * fftshift(sf);

2、

function [out] = sigexpand(d, M)
%将输入的序列扩展为间隔为N – 1个0的序列
%M:系统采样频率
%d:输入的二进制代码
%out:为1 * (M * length(d))维的矩阵
N = length(d);
out = zeros(M, N);
out(1, :) = d;
out = reshape(out, 1, M * N);
end

3、

function [out] = PCM(Ac)
v = 1;  % 过载电平
t = 0 : 0.01 : 10;
s = Ac * sin(2 * pi * t);  % 抽样序列
y = floor(s / v * 4096);  % 信号值转化为量化单位
pcm_en = pcm_encode(y);  % pcm编码
pcm_de = pcm_decode(pcm_en, v);  % pcm译码
Nq = mean((s - pcm_de).^2);  % 计算量化噪声功率
S = mean(s .^ 2);  % 计算信号平均功率
out = S / Nq;
end

4、

function [out] = pcm_encode(x)
% 输入x参数为0~4096的样值,输出out为8位二进制码
n = length(x);
for i = 1 : n% 编写段落码if x(i) > 0out(i, 1) = 1;elseout(i, 1) = 0;end% 编写段内码计算量化间隔和量化起始电平if abs(x(i)) > 0 && abs(x(i)) < 32%段落码out(i, 2) = 0;out(i, 3) = 0;out(i, 4) = 0;% 量化间隔step = 2;%起始电平st = 0;elseif 32 <= abs(x(i)) && abs(x(i)) < 64out(i, 2) = 0;out(i, 3) = 0;out(i, 4) = 1;step = 2;st = 32;elseif 64 <= abs(x(i)) & abs(x(i)) < 128out(i, 2) = 0;out(i, 3) = 1;out(i, 4) = 0;step = 4;st = 64;elseif 128 <= abs(x(i)) & abs(x(i)) < 256out(i, 2) = 0;out(i, 3) = 1;out(i, 4) = 1;step = 8;st = 128;elseif 256 <= abs(x(i)) & abs(x(i)) < 512out(i, 2) = 1;out(i, 3) = 0;out(i, 4) = 0;step = 16;st = 256;elseif 512 <= abs(x(i)) & abs(x(i)) < 1024out(i, 2) = 1;out(i, 3) = 0;out(i, 4) = 1;step = 32;st = 512;elseif 1024 <= abs(x(i)) & abs(x(i)) < 2048out(i, 2) = 1;out(i, 3) = 1;out(i, 4) = 0;step = 64;st = 1024;elseif 2048 <= abs(x(i)) & abs(x(i)) < 4096out(i, 2) = 1;out(i, 3) = 1;out(i, 4) = 1;step = 128;st = 2048;elseout(i, 2) = 1;out(i, 3) = 1;out(i, 4) = 1;step = 128;st = 2048;endif(abs(x(i)) >= 4096)% 处理过载现象out(i, 2: 8) = [1 1 1 1 1 1 1];else% 计算段落码tmp = floor((abs(x(i)) - st) / step);t = dec2bin(tmp, 4) - 48;out(i, 5 : 8) = t(1 : 4);end
end
out = reshape(out', 1, 8 * n);

5、

function [out] = pcm_decode(in, v)
% 输入in为8位二进制码,(-v, +v)为量化区间
n = length(in);
in = reshape(in', 8, n / 8)';
slot(1) = 0;
slot(2) = 32;
slot(3) = 64;
slot(4) = 128;
slot(5) = 256;
slot(6) = 512;
slot(7) = 1024;
slot(8) = 2048;
step(1) = 2;
step(2) = 2;
step(3) = 4;
step(4) = 8;
step(5) = 16;
step(6) = 32;
step(7) = 64;
step(8) = 128;
for i = 1 : n / 8ss = 2 * in(i, 1) - 1;tmp = in(i, 2) * 4 + in(i, 3) * 2 + in(i, 4) + 1;st = slot(tmp);dt = (in(i, 5) * 8 + in(i, 6) * 4 + in(i, 7) * 2 + in(i, 8)) * step(tmp) + 0.5 * step(tmp);out(i) = ss * (st + dt) / 4096 * v;
end

四、实验结果

1、
(1)、低通信号x(t)的波形:
在这里插入图片描述

图1
(2)、抽样速率为4Hz的抽样序列:
在这里插入图片描述

图2
(3)、抽样序列恢复出的原始信号:
在这里插入图片描述

图3
2、
(1)、未编码的波形:
在这里插入图片描述

图4
(2)、经过PCM编码后的波形(部分,由于采样点数太多导致无法全部画完):
在这里插入图片描述

图5
(3)、译码后的波形:
在这里插入图片描述

图6
(4)、不同幅度Ac情况下,PCM译码后的量化信噪比:
在这里插入图片描述

图7

五、实验分析

在这里插入图片描述
在这里插入图片描述

六、参考文献

1、《通信原理(第7版)》,樊昌信 曹丽娜 编著,北京,国防工业出版社,2022年1月。

2、《信号与系统(第二版)》,【美】Alan V. Oppenheim 等 著,刘树棠 译,北京,电子工业出版社,2020年8月。

这篇关于【本科生通信原理】【实验报告】【北京航空航天大学】实验四:模拟信号的数字化及编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577330

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意