用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真
1.1 DPCM原理
差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一个抽样值来计算出一个预测值,然后取当前抽样值和预测值之差进行编码。由于抽样值和预测值非常接近,预测误差的可能取值范围比抽样值变化范围小,因此可以用较少的比特数来对预测误差进行编码,从而降低数据的比特率。DPCM是利用信号的时间相关性来减少所需的编码比特数。需要对模拟信号进行周期性扫描,将时间上连续的信号变成时间上离散的信号,根据前一个抽样值计算出一个预测值,计算当前抽样值和预测值之差,即预测误差,并对其进行量化。然后对量化后的预测误差进行编码。在接收端,根据已知的预测值和预测误差进行解码,恢复原始信号。
DPCM可以有效利用信号的时间相关性来减少数据量,这对于具有强相关性的数据特别有效。
在DPCM系统中,需要注意的是预测器的输入是已经解码以后的样本。之所以不用原始样本来做预测,是因为在解码端无法得到原始样本,只能得到存在误差的样本。因此在DPCM编码器中实际内嵌了一个解码器,如编码器中虚线框中所示。在一个DPCM系统中,有两个因素需要设计:预测器和量化器。预测器和量化器应进行联合优化。分别进行线性预测器和量化器的优化设计。
1.2 使用Maltab进行DPCM仿真
代码及注释:
1. 生成输入信号
Fs = 1000; % 采样率 (Hz)
t = 0:1/Fs:0.1; % 时间向量(0.1秒)
x = sin(2pi50*t); % 50 Hz的正弦信号
Fs(采样率):每秒1000个采样点,确保信号足够平滑。
t(时间向量):从0秒到0.1秒的时间步长为1/Fs秒。
x(信号):50 Hz的正弦信号,模拟一个周期性简单的输入信号。
解释:
正弦信号是经典的测试信号,便于观测DPCM的效果。如果希望使用其他信号(如语音数据),可以替换这部分代码。
2. 初始化DPCM变量
N = length(x); % 信号长度
x_pred = zeros(1, N); % 预测信号初始化
e = zeros(1, N); % 预测误差初始化
x_rec = zeros(1, N); % 重建信号初始化
quant_step = 0.1; % 量化步长(控制量化误差)
N:计算信号的长度。
x_pred、e、x_rec:初始化预测信号、预测误差和重建信号,这些变量用于存储逐个采样点的计算结果。
quant_step:量化步长,控制预测误差的量化精度,数值越大意味着压缩越强、但重建误差越大。
解释:
这里假设量化器的步长为0.1,意味着预测误差会被四舍五入到0.1的倍数。步长越大,重建信号的精度越低,失真越明显。
3. DPCM编码与解码过程
for n = 2:N
% 使用上一重建值作为预测值
x_pred(n) = x_rec(n-1);
% 计算预测误差
e(n) = x(n) - x_pred(n);% 量化误差并传输
e_quant = round(e(n) / quant_step) * quant_step;% 重建信号:累加量化后的误差
x_rec(n) = x_pred(n) + e_quant;
解释:
DPCM的核心思想是预测当前样本,并只传输预测误差。重建信号在解码端通过累加预测误差实现。这个简单的一阶预测器适合平滑信号,但对于复杂信号可能不够精确。
4. 绘制原始信号、预测误差和重建信号
figure;
% 子图1:原始信号
subplot(3,1,1);
plot(t, x, ‘b’, ‘LineWidth’, 1.5);
title(‘原始信号’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
grid on;
% 子图2:预测误差
subplot(3,1,2);
stem(t, e, ‘filled’, ‘MarkerSize’, 4, ‘MarkerFaceColor’, ‘r’);
title(‘预测误差 (e[n])’);
xlabel(‘时间 (s)’); ylabel(‘误差幅度’);
grid on;
% 子图3:重建信号
subplot(3,1,3);
plot(t, x_rec, ‘g–’, ‘LineWidth’, 1.2);
title(‘重建信号’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
grid on;
子图1:绘制原始信号,显示它的基本周期性变化。
子图2:绘制预测误差,使用离散点(stem)展示误差的大小和分布。
子图3:绘制重建信号,与原始信号进行对比。
解释:
将三个重要信号分开绘制,便于观察各自的特征:
原始信号 vs 重建信号:重建信号与原始信号应尽量吻合,若量化步长过大则会出现较明显偏差。
预测误差:误差越小,表示预测器越准确,DPCM压缩效果越好。
5. 计算并显示均方误差 (MSE)
MSE = mean((x - x_rec).^2);
disp(['重建信号的均方误差 (MSE): ', num2str(MSE)]);
MSE(均方误差):衡量原始信号和重建信号之间的平均误差,数值越小表示重建效果越好。
运行结果:
原始信号与解码后的DPCM信号在整体趋势上较为相似,这表明DPCM编码和解码过程在一定程度上能够较好地还原原始信号的特征。两者的波形形状大致相同,说明DPCM算法在保留信号主要信息方面具有较好的效果。此外,误差信号的幅度相对较小,说明DPCM编码和解码过程产生的误差在可接受范围内,并且误差信号没有明显的规律性,表明误差不是由系统性因素引起的,而是随机分布的。自适应量化因子随着样本索引的变化而动态调整,这种自适应调整能够根据信号的变化实时优化量化过程,从而提高编码效率和信号质量。DPCM算法在一定程度上能够有效地对信号进行编码和解码,并且具有自适应量化的优势。
1.3 使用SIMULINK进行DPCM仿真
在Simulink中搭建DPCM(差分脉冲编码调制)仿真电路时,要使用Simulink中的“Random Integer Generator”模块生成信号源数据,它是一个连续或离散的输入信号,用于提供系统的初始数据。信号源向下连接到一个“加法器”(+、-符号)。这个加法器用于计算输入信号与反馈信号之间的差值,起到误差信号生成的作用。从加法器的左下方有一个反馈回路,包含一个“延迟单元”(标记为 ),这意味着系统中使用的是离散时间处理。延迟单元的输出信号被反馈到加法器,生成一个反馈回路,用于差分调制的计算。从加法器的右上角,误差信号输出连接到一个存储模块(类似一个方框)。这个模块可能用于存储或观察差分编码后的误差信号。从加法器右侧输出的信号同时传递到一个新的加法器,该加法器用于累加当前误差信号与前一时刻的信号,在接收端对差分编码信号进行累加,以恢复原始信号。累加器输出通过另一个延迟单元进行反馈,作为下一次累加的输入。这种结构保证了在每次计算时包含上一个累加值,以构建累积反馈。最右端的存储模块用于显示或存储最终的输出信号,以便于对恢复后的信号进行观察和分析。
信号源的Amplitude正弦波的振幅设置为1,Frequency (rad/sec) 正弦波的频率也设置为1,这意味着生成的正弦波将具有1的振幅,0的偏置,1 rad/sec的频率,0的相位,且没有指定采样时间:
设置一个加法器,使其符号为±:
再设置一个加法器,使其符号为++:
分别接上两个延迟单元,使得系统中使用的是离散时间处理,从而生成反馈回路。
以上三个示波器分别观察原始信号,编码信号,解码信号。
观察原始信号波形:
观察编码信号波形:
观察解码信号:
通过以上SIMULINK的仿真,可以看到原始信号经过编码,然后解码以恢复信号。
2、使用SIMULINK或Matlab实现双边带调幅系统仿真
2.1 双边带调幅原理
双边带调制(DSB)通过将基带信号的频谱完整地搬移到载波频率的上下两侧,但这种调制方式的信号包络不恒定,导致发射端的平均功率和峰值功率差异较大。此外,为了避免失真,发射机需要在高功率下保持良好的线性输出,但会增加设备的成本和功耗。
虽然双边带调制在小信号传输时具有良好的线性特性,能够较好地保留基带信号的幅度和波形信息,但其抗噪声性能相对较差。在噪声或干扰严重的环境中,信号的完整性易受影响,导致接收端解调出的信号质量下降。双边带调制常需要采用较高信噪比的信道,或依赖其他抗干扰手段以确保通信质量。此外,DSB 的接收端需要实现同步解调,即载波相位必须与发射端保持一致,这对接收机的设计带来了额外的复杂性。同步解调器不仅需要精确的载波恢复电路,还可能增加额外的信号处理延迟,影响系统的实时性能。
2.2 使用Maltab进行双边带调幅系统仿真
代码及注释:
1. 初始化与参数设置
fs = 1e4; % 采样频率 (Hz)
t = 0:1/fs:3-1/fs; % 时间向量 (3秒,方便观察)
fc = 1000; % 载波频率 (Hz)
fm = 5; % 基带信号频率 (Hz)
fs:采样频率设置为10 kHz,保证信号处理精度和避免混叠。
t:时间向量定义为3秒,步长为1/fs,用于生成离散信号。
fc 和 fm:分别定义载波和基带信号频率。载波频率为1 kHz,而基带频率降低为5 Hz,便于在图上清楚地观察调制后的包络。
2. 基带信号生成
m_t = cos(2pifm*t);
subplot(3, 2, 1);
plot(t, m_t); grid on;
title(‘基带信号 m(t)’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
基带信号m(t):一个频率为5 Hz的正弦波,代表待传输的低频信息。
绘图:在第一子图显示基带信号,可以看到3秒内基带信号缓慢变化的正弦波形。
3. 载波信号生成
c_t = cos(2pifc*t);
subplot(3, 2, 2);
plot(t(1:500), c_t(1:500)); grid on; % 截取部分数据以方便观察
title(‘载波信号 c(t)’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
载波信号c(t):一个频率为1 kHz的正弦波,用于调制基带信号。
绘图:由于载波频率较高,绘制了前500个采样点(0.05秒),以方便观察其波形。
4. 双边带调制 (DSB-AM)
s_t = m_t .* c_t;
subplot(3, 2, 3);
plot(t, s_t); grid on;
title(‘调制信号 s(t)’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
调制信号:s(t) = m(t) * c(t),基带信号与载波相乘,实现双边带调制。
结果:调制信号的包络跟随基带信号的变化(形成包络波形),频率主要集中在载波附近。
5. 调制信号的频谱分析
N = length(t);
S_f = abs(fftshift(fft(s_t)))/N;
f = linspace(-fs/2, fs/2, N);
subplot(3, 2, 4);
plot(f, S_f); grid on;
title(‘调制信号的频谱’);
xlabel(‘频率 (Hz)’); ylabel(‘幅度’);
fft:计算调制信号的快速傅里叶变换 (FFT)。
fftshift:将频谱中心移到零频率处,以对称显示频谱。
频谱内容:可以看到基带信号被完整地搬移到正负载波频率(±1 kHz)两侧。
6. 加入高斯白噪声
snr = 10; % 信噪比 (dB)
s_t_noisy = awgn(s_t, snr, ‘measured’);
subplot(3, 2, 5);
plot(t, s_t_noisy); grid on;
title(‘含噪声的调制信号’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
噪声生成:
使用awgn函数为调制信号添加高斯白噪声。
snr:信噪比设置为10 dB,模拟噪声环境。
绘图:观察含噪信号的波形,可以看到信号波形有噪声干扰。
7. 同步解调与低通滤波
r_t = s_t_noisy .* c_t; % 乘以相同载波
[b, a] = butter(5, 2*fm/fs); % 设计低通滤波器
m_t_recovered = filter(b, a, r_t); % 滤波提取基带信号
subplot(3, 2, 6);
plot(t, m_t_recovered); grid on;
title(‘解调后的信号’);
xlabel(‘时间 (s)’); ylabel(‘幅度’);
同步解调:
含噪信号r(t)与同频载波相乘,相当于将调制信号搬回基带频率。
低通滤波:
使用巴特沃斯滤波器 (Butterworth) 滤除高频成分,仅保留解调后的基带信号。
滤波器设计:butter(5, 2*fm/fs),5阶滤波器,截止频率为基带信号的两倍。
绘图:在第六子图展示解调后的信号。可通过观察包络波形,验证解调的有效性。
运行结果:
图中第一幅图代表的是基带信号是一个频率为 5 Hz 的正弦波。表示待传输的原始信息,在调制过程中会映射到更高频段。基带信号为低频,直接传输可能不现实,原因包括易受干扰和不易通过无线电传播。需要将其调制到高频载波上。
第二幅图载波信号是频率为 1000 Hz 的高频正弦波。在图中只显示了前500个采样点的载波信号(约0.05秒),因为频率较高,完整展示会显得非常密集。载波的作用是将基带信号搬移到高频段,以适应无线电传播和频分复用需求。
第三幅图调制信号的包络(外轮廓)与基带信号 m(t) 一致,但频率为载波频率的 1000 Hz。DSB-AM调制将基带信号乘以载波信号,包络反映了基带信号的信息。双边带调制同时在载波频率两侧产生对称的频谱。从这张图可以看出调制信号中的包络变化,信号的幅度随基带信号的变化而波动。
第四幅图频谱中显示了两侧的频率成分,分别位于±1000 Hz(载波频率)附近。每侧包含基带信号的频谱信息,形成双边带结构。频谱中显示了两侧的频率成分,分别位于±1000 Hz(载波频率)附近。每侧包含基带信号的频谱信息,形成双边带结构。
第五幅图在添加10dB 信噪比(SNR) 的高斯白噪声后,信号的波形开始变得不规则,受到噪声干扰。虽然波形包络仍然存在,但受到了一些随机噪声的扰动。这部分模拟了真实传输环境中的噪声干扰。信噪比(SNR)越低,噪声干扰越大,传输效果越差。观察这部分的结果可以了解噪声对调制信号的破坏程度。
第六幅图解调后的信号与原始基带信号m(t)非常相似,但可能包含了一些噪声成分和微小失真。这是通过与载波相乘后,经过低通滤波处理的结果。同步解调依赖于载波的精确同步,成功恢复基带信号。如果解调信号失真严重,说明可能存在载波不同步或噪声过大问题。
双边带调幅系统在调制阶段原始低频信号被调制到高频载波上,使其适合无线传播。频谱上体现了双边带特性,两侧频率对称,包络信息与基带信号一致。噪声干扰可以观察模拟传输过程中的噪声影响,观察不同信噪比(SNR)对信号的干扰程度。在理想同步条件下,解调后的信号与原始基带信号接近,说明系统可以成功提取原始信息。
2.3 使用SIMULINK进行双边带调幅系统仿真
在SIMULINK上使用两个正弦波输入信号源,这两个信号源是不同频率的正弦波,用于进行信号的组合处理。两个信号源输入连接到一个乘法器(“×”符号),用于对两个信号进行相乘操作。这个用于信号调制或相位相关操作。在调制系统中,乘法器可以用于实现振幅调制(AM),将载波信号和基带信号相乘生成调制信号。乘法器的输出连接到一个绝对值模块(“|u|”符号),对相乘后的信号取绝对值。绝对值操作用于去掉信号的负值成分,使信号波形保持正向。比如在包络检测中,取绝对值可以得到信号的包络信息。绝对值模块的输出连接到一个传递函数模块。该传递函数相当于一个一阶低通滤波器,可以滤除高频成分,仅保留信号的低频部分。低通滤波器再用于平滑信号或提取信号的包络信息。最右端的模块用于观测和输出最终的信号。将其连接到示波器模块,用于观察经过滤波器处理后的信号波形。在信号的乘法器和绝对值模块的分支位置,有两个存储模块。它们可能用于记录信号在特定节点的输出,以便分析和对比各处理步骤的信号变化。
也就是通过输入的两个正弦信号相乘得到调制信号,再将调制信号取绝对值,用于包络提取或调制信号的整形。绝对值后的信号通过低通滤波器进行平滑,得到低频成分。最终的输出信号是调制信号的包络,经过滤波后可以进行进一步观察。
两个信号源的频率分别如下:
将信号源的振幅(Amplitude)设置为1。这表示正弦波信号的最大值和最小值分别是 1和 -1。再将频率设置为 50 弧度/秒。这表示正弦波每秒完成 50 个周期。
另外一个信号源的振幅(Amplitude)设置为0.5。再将频率设置为 5 弧度/秒。将这两个信号源不同频率的正弦波,用于进行信号的组合处理。
以下是传递函数模块的参数配置窗口,Numerator Coefficients(分子系数)设置为 [1],表示传递函数的分子部分是一个常数,即1。这表明着传递函数的分子是一个常数1的多项式。没有更高次项,用于一阶或简单系统的传递函数。Denominator Coefficients(分母系数)设置为 [1 5] , 该形式对应一个一阶低通滤波器,能够平滑高频成分。Absolute Tolerance(绝对容差)设置为 auto,即Simulink自动选择容差。
最后通过三个示波器进行观察双边带调幅系统的信号:
观察调制信号:
观察条幅信号:
观察解调信号:
其中调幅信号的振幅范围比调制信号小,这是由于调制过程中的放大或衰减。解调信号的振幅进一步减小,这是由于信道噪声或解调器的不完美。总体是原始信号经过调幅处理,然后通过信道传输,最后进行解调以恢复原始信息。
相关文章:

用Matlab和SIMULINK实现DPCM仿真和双边带调幅系统仿真
1、使用SIMULINK或Matlab实现DPCM仿真 1.1 DPCM原理 差分脉冲编码调制,简称DPCM,主要用于将模拟信号转换为数字信号,同时减少数据的冗余度以实现数据压缩。在DPCM中,信号的每个抽样值不是独立编码的,而是通过预测前一…...

RabbitMQ的交换机总结
1.direct交换机 2.fanout交换机...

Android so库的编译
在没弄明白so库编译的关系前,直接看网上博主的博文,常常会觉得云里雾里的,为什么一会儿通过Android工程cmake编译,一会儿又通过NDK命令去编译。两者编译的so库有什么区别? android版第三方库编译总体思路: 对于新手小白来说搞明白上面的总体思路图很有必…...
2024年底-Arch linux或转为0BSD许可证!
原文:https://archlinux.org/news/providing-a-license-for-package-sources/ 解读:Arch Linux社区通过RFC 40达成共识,决定将所有软件包源代码更改为0BSD许可证。 0BSD许可证是什么?:这是一个非常自由的开源许可证&a…...
深入解析音视频流媒体SIP协议交互过程
一、引言 在音视频流媒体传输过程中,SIP(Session Initiation Protocol)协议发挥着举足轻重的作用。本文将详细全面地介绍音视频流媒体传输中的SIP协议,包括其基本概念、交互过程、关键信令以及应用场景 二、SIP协议基本概念 1.…...

linux安装mysql8.0.40
一、下载MySQL安装包 1.查看glibc版本 rpm -qa | grep glibc 2.到mysql官网下载安装包 二、解压安装 1.上传压缩包纸/usr/local 目录下,解压: tar -xvf mysql-8.0.40-linux-glibc2.17-x86_64.tar.xz 2.重命名: mv mysql-8.0.40-linux-…...

Java基础之控制语句:开启编程逻辑之门
一、Java控制语句概述 Java 中的控制语句主要分为选择结构、循环结构和跳转语句三大类,它们在程序中起着至关重要的作用,能够决定程序的执行流程。 选择结构用于根据不同的条件执行不同的代码路径,主要包括 if 语句和 switch 语句。if 语句有…...
如何还原 HTTP 请求日志中的 URL 编码参数?详解 %40 到 @
在记录HTTP请求的日志中出现了这样的情况: 2024-11-20 11:12:49 INFO network_request gz_login 96 Body: countryAbbrCN&countryCode86&email1222405567%40qq.com&password12354e50456db124f9f34e2789308733&type1 出现这种情况的原因是&#x…...
usb_cam ros包话题说明,image transport包使用
1. /usb_cam/image_raw 类型: sensor_msgs/Image 内容: 摄像头采集的原始图像数据。 用途: 图像处理和分析,例如使用 OpenCV 处理图像。视频流可达10MB/s 图像流查看,例如用 rqt_image_view 进行显示: 2./usb_cam/image_raw/compressed …...

微前端-MicroApp
微前端即是由一个主应用来集成多个微应用(可以不区分技术栈进行集成) 下面是使用微前端框架之一 MicroApp 对 react微应用 的详细流程 第一步 创建主应用my-mj-app 利用脚手架 npx create-react-app my-mj-app 快速创建 安装 npm install --save rea…...
Unity UGUI 垂直循环复用滚动
一 基础类 在unity里面新建这几个类 using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// 垂直方向滚动 /// </summary> public class CustomScroll:MonoBehaviour {public …...
Spring MVC 深度剖析:优势与劣势全面解读
文章目录 Spring MVC 优势1. **松耦合**2. **易于测试**3. **灵活性**4. **强大的配置机制**5. **异常处理**6. **国际化支持**7. **数据验证**8. **安全性**9. **性能优化** Spring MVC 劣势1. **学习曲线**2. **配置复杂性**3. **性能开销**4. **视图技术限制**5. **社区和支…...
力扣hot100-->前缀和/前缀书/LRU缓存
前缀和 1. 560. 和为 K 的子数组 中等 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1: 输入:nums [1,1,1], k 2 输出:2示例 2&#…...

Three.js CSS2D/CSS3D渲染器
在Three.js开发过程中,有时需要将 HTML 元素与 Three.js 渲染的 3D 场景相结合,这就需要用到 CSS2DRenderer 和 CSS3DRenderer。本文将详细介绍这两种渲染器的原理及其应用 一、CSS2DRenderer 渲染器 概述 CSS2DRenderer 渲染器用于在 3D 场景中渲染纯…...
mongodb文档字符串批量替换
【mongodb文档字符串批量替换脚本语句】 前言: 1、本方式对于数据量大的情况不适用,执行可能比较慢; 2、数据量大的情况,个人推荐代码层面解决,多线程替换更快: (1)写实体类的方式…...
前端安全和解决方案
提到这个我可能想到的就是不要暴露太多的账号密码信息。一些页面的请求和操作要加上权限。 然后下面就详细的介绍前端可能遇到的安全问题以及解决方法。 首先比较常见的前端的安全性问题就是跨站脚本攻击(XSS)。跨站请求伪造(csrfÿ…...
Tlias智能辅助学习系统-部门管理
包括查询、新增、删除、修改功能 控制层 package com.itheima.controller;import com.itheima.pojo.Dept; import com.itheima.pojo.Result; import com.itheima.service.DeptService; import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.XSlf4j; import org.spr…...

React第十节组件之间传值之context
1、Context 使用creatContext() 和 useContext() Hook 实现多层级传值 概述: 在我们想要每个层级都需要某一属性,或者祖孙之间需要传值时,我们可以使用 props 一层一层的向下传递,或者我们使用更便捷的方案,用 creatC…...
flink中barrier不对齐的原因和影响
Barrier 不对齐(Barrier Misalignment)可能导致一些性能和一致性相关的问题,但 Flink 提供了机制来确保即使在不对齐的情况下,也可以保证数据的一致性。 1. 什么是 Barrier 不对齐? Barrier 不对齐是指在分布式数据流…...

软银集团孙正义再度加码OpenAI,近屿智能专注AI人才培养
11月28日凌晨,全球最大财经CNBC报道,软银集团创始人兼CEO孙正义再次向人工智能领域的领军企业OpenAI投资了15亿美元。软银对OpenAI的投资已不是首次。就在上个月,软银已在OpenAI的上一轮融资中注入了5亿美元的资金。但他一直寻求获得OpenAI更…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...