一、实验名称:

实验四 通信系统仿真实验

二、实验目的:

1.熟悉MATLAB通信工具箱。

2.掌握MATLAB中通信工具箱的函数命令。

三、实验原理及步骤

四、实验时间

2024.12.23

五、实验仪器:

计算机、软件:MATLAB

六、实验结果:

1、命令

m函数创建

function [t, omg, ft, ift] = prefourier(trg, n, omgrg, k)

T = trg(2) - trg(1);

t = linspace(trg(1), trg(2) - T / n, n)';

OMG = omgrg(2) - omgrg(1);

omg = linspace(omgrg(1), omgrg(2) - OMG / k, k)';

ft = T / n * exp(-1j * kron(omg, t.'));

ift = OMG / 2 / pi / k * exp(1j * kron(t, omg.'));

end

主函数

clc

clear

[t, omg, ft, ift] = prefourier([0, 5], 1000, [-250, 250], 1000);

g = 3 * cos(10 * t) + 2 * cos(20 * t);% 定义基带信号g,由两个余弦信号组成

f = g.* cos(100 * t);% 对基带信号g进行调制得到信号f

g0 = f.* cos(100 * t);% 对信号f进行进一步操作得到g0

G0 = ft * g0;% 计算g0的傅里叶变换,得到G0

h = ( omg < 30 & omg > -30);

G1 = G0.* h;% 对G0应用低通滤波器,得到G1

g1 = ift * G1; % 对G1进行傅里叶逆变换得到时域信号g1

G = ft * g; % 计算g的傅里叶变换,得到G

% 计算f的傅里叶变换,得到F

F = ft * f;

% 绘制基带信号g的时域波形

subplot(4, 1, 1)

plot(t, g)

xlabel('t')

ylabel('g(t)')

title('30');

% 绘制调制信号f的时域波形

subplot(4, 1, 2)

plot(t, f)

xlabel('t')

ylabel('f(t)')

% 绘制信号g0的时域波形

subplot(4, 1, 3)

plot(t, g0)

xlabel('t')

ylabel('g0(t)')

% 绘制经过滤波后的时域信号g1的波形

subplot(4, 1, 4)

plot(t, g1)

xlabel('t')

ylabel('g1(t)')

figure

% 绘制基带信号g的频域特性

subplot(5, 1, 1)

plot( omg, G)

axis([-250 250 -2 8])

xlabel('w')

ylabel('G(w)')

title('30');

% 绘制调制信号f的频域特性

subplot(5, 1, 2)

plot( omg, F)

axis([-250 250 -2 4])

xlabel('w')

ylabel('F(w)')

% 绘制信号G0的频域特性

subplot(5, 1, 3)

plot( omg, G0)

axis([-250 250 -2 4])

xlabel('w')

ylabel('G0(w)')

% 绘制低通滤波器特性h的频域表示

subplot(5, 1, 4)

plot( omg, h)

axis([-250 250 -0.5 1.5])

xlabel('w')

ylabel('H(w)')

% 绘制经过滤波后的信号G1的频域特性

subplot(5, 1, 5)

plot( omg, G1)

axis([-250 250 -2 4])

xlabel('w')

ylabel('G1(w)')

效果截图

图 1

2、命令

clear all

close all

M = 4; % 设定调制阶数为4对应QPSK调制方式

EsNOdB = 3 : 0.5 : 10; %定义信噪比的取值范围

EsNO = 10.^(EsNOdB / 10); %将信噪比从分贝值转换为线性值

Es = 1; % 设置信号能量为1

NO = 10.^(-EsNOdB / 10); %根据信噪比分贝值计算噪声功率谱密度

sigma = sqrt(NO / 2); %计算噪声标准差

error = zeros(1, length(EsNOdB)); %初始化用于存储不同信噪比下误码数的向量

s_data = zeros(1, length(EsNOdB)); %初始化用于存储不同信噪比下传输符号数的向量

for k = 1 : length(EsNOdB)

    error(k) = 0;

    s_data(k) = 0;

    while error(k) < 1000

        d = ceil(rand(1, 10000) * M); %生成随机的数据符号序列,范围基于调制阶数M

        s = sqrt(Es) * exp(1j * 2 * pi / M * (d - 1)); %将数据符号调制成QPSK复基带信号

        r = s + sigma(k) * rand(1, length(d)) + 1j * randn(1, length(d)); %给调制信号添加信道噪声得到接收信号

        for m = 1 : M

            rd(m, :) = abs(r - sqrt(Es) * exp(1j * 2 * pi / M * (m - 1)));

        end

        for m = 1 : length(s)

            dd(m) = find(rd(:, m) == min(rd(:, m)));

            if dd(m) ~= d(m)

                error(k) = error(k) + 1;

            end

        end

        s_data(k) = s_data(k) + 10000;

    end

end

Pe = error./ s_data; % 计算不同信噪比下的实际误码率

Ps = erfc(sqrt(EsNO) * sin(pi / M)); % 计算QPSK调制的理论误码率

semilogy(EsNOdB, Pe, 'b*');

hold on;

semilogy(EsNOdB, Ps, 'r--');

xlabel('Es/NO (dB)');

ylabel('Bit Error Rate');

title('30')

legend('仿真结果', '理论计算结果');

效果截图

图 2

  1. 命令
clear

close all

dx = 0.01;

x = -1 : dx : 1;

u = 255;

A = 87.6;

yu = sign(x).* log(1 + u * abs(x)) / log(1 + u); % u law相关计算,根据给定公式计算y(u)的值

for i = 1 : length(x) % A law相关计算,通过循环根据不同条件计算y(A)的值

    if abs(x(i)) < 1 / A

        ya(i) = A * x(i) / (1 + log(A));

    else

        ya(i) = sign(x(i)) * (1 + log(A * abs(x(i)))) / (1 + log(A));

    end

end

figure(1)

plot(x, yu, 'k.:'); % 绘制u law对应的曲线,颜色为黑色,点线样式

axis([0 1 0 1]);

title('u law');

xlabel('x');

ylabel('y');

grid on;

hold on;

xx = [-1, -127 / 255, -63 / 255, -31 / 255, -15 / 255, -7 / 255, -3 / 255, -1 / 255, 1 / 255, 3 / 255,...

    7 / 255, 15 / 255, 31 / 255, 63 / 255, 127 / 255, 1]; % 定义一组x坐标值

yy = [-1, -7 / 8, -6 / 8, -5 / 8, -4 / 8, -3 / 8, -2 / 8, -1 / 8, 1 / 8, 2 / 8, 3 / 8, 4 / 8, 5 / 8, 6 / 8, 7 / 8, 1];

% 定义一组y坐标值

plot(xx, yy, 'r'); % 绘制红色曲线

axis([0 1 0 1]);

hold on;

stem(xx, yy, 'b-.'); % 绘制蓝色点划线形式的离散序列

axis([0 1 0 1]);

legend('u律压缩特性','折线近似u律');

figure(2)

plot(x, ya, 'k.:'); % 绘制A law对应的曲线,黑色点线样式

axis([0 1 0 1]);

title('(30)A law');

xlabel('x');

ylabel('y');

grid on;

hold on;

xx = [-1, -1 / 2, -1 / 4, -1 / 8, -1 / 16, -1 / 32, -1 / 64, -1 / 128, 1 / 128, 1 / 64, 1 / 32, 1 / 16, 1 / 8,...

    1 / 4, 1 / 2, 1]; % 定义一组x坐标值

yy = [-1, -7 / 8, -6 / 8, -5 / 8, -4 / 8, -3 / 8, -2 / 8, -1 / 8, 1 / 8, 2 / 8, 3 / 8, 4 / 8, 5 / 8, 6 / 8, 7 / 8, 1];

% 定义一组y坐标值

plot(xx, yy, 'r'); % 绘制红色曲线

axis([0 1 0 1]);

hold on; % 保持图形

stem(xx, yy, 'b-.'); % 绘制蓝色点划线形式的离散序列

axis([0 1 0 1])

legend('A律压缩特性','折线近似A律')

效果截图

图 3

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐