【限免】通信信号与干扰信号【附MATLAB代码】

news2024/9/23 5:32:26

微信公众号:EW Frontier

关注可了解更多的雷达、通信、人工智能相关代码。问题或建议,请公众号留言;

个人博客:106.54.201.174 QQ交流群:949444104

摘要

本项目主要模拟仿真常见通信信号及干扰信号,高斯白噪声、噪声调幅信号干扰、噪声调频信号干扰、单音干扰、多音干扰、线性扫频干扰、2ASK、2FSK、BPSK、16QAM、64QAM。各部分内容原理请读者自行百度或知网搜索即可。本文仅分享MATLAB代码!

可自行将干扰信号与通信信号程序进行组合,模拟仿真不同干扰信号下通信信号受扰现象。

高斯白噪声

%% 高斯白噪声信号
figure
length = 1000000;
ff = 0:length-1;
noise = wgn(length,1,0);%生成100000*1个高斯白噪声,功率为0dBW(分贝瓦)
y1 = fft(noise,length);%采样点个数100000个
p1 = y1.*conj(y1);%conj()得到相应的复共轭数,y1.*conj(y1)就是模的平方
max_P=max(p1);%求功率的最大值
p1 =p1/(max_P);%除以最大值把功率谱归一化
​
subplot(2,2,1),plot(ff,noise(1:length)),axis([0 (length) -5 5]),xlabel('时间(s)'),ylabel('幅值(V)'),title('高斯白噪声波形');
subplot(2,2,2),plot(ff,p1(1:length)),axis([0 length 0 1]);xlabel('频率(Hz)');ylabel('功率');title('高斯白噪声归一化功率谱');
set(gca,'YTick',0:1:1);%设置逻辑值坐标轴为0和1,这样子就不会出现0-0.1-0.2^0.8-0.9-1的坐标,影响美观
subplot(2,2,3),hist(noise,40);axis([ -5 5 0 110000]);xlabel('幅值(V)');ylabel('频次');title('幅值-频次直方图');
mean_value = mean(noise)%计算噪声的均值,理论上应该是0
variance = var(noise)%计算噪声的方差,理论上应该为1,功率为0dBW(10*log1=0)
figure

噪声调幅信号干扰

%% 噪声调幅信号
clear length
fj=20e6;fs=4*fj; Tr=520e-6;
t1=0:1/fs:3*Tr-1/fs; 
N=length(t1);
u=wgn(1,N,0);%生成N*1个高斯白噪声,功率为0dBW(分贝瓦)
df1=fs/N;n=0:N/2;f=n*df1;
wp=10e6;ws=14e6;rp=1; rs=60;
[n1,wn1]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);
[b,a]=butter(n1,wn1);
u1=filter(b,a,u);
p=0.1503*mean((u1.^2));
figure;subplot(2,2,1),plot(t1,u1),title('噪声信号波形'); axis([0,0.02e-4,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,2), j2=fft(u1);plot(f,10*log10(abs(j2(n+1)*2/N)));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-70,0]);title( '噪声信号功率谱');
u0=1;y=(u1+u0).*cos(2*pi*fj*t1+2);%噪声调幅信号的波形
u2=u1+u0;%上包络的波形
u3=-u0-u1;%下包络的波形
subplot(2,2,3), plot(t1,y,t1,u2,t1,u3),title( '噪声调幅信号时域波形'); axis([0,0.02e-4,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,4), J=fft(y);plot(f,10*log10(abs(J(n+1))));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声调幅信号功率谱');
​

噪声调频信号干扰

%% 噪声调频信号
figure
uj=1;mf=2;wpp=10;
fj=20e6;fs=8*fj;Tr=520e-6;
t1=0:1/fs:3*Tr-1/fs;N=length(t1);
u=wgn(1,N,0);
wp=10e6;ws=16e6;rp=1;rs=60;
[n1,wn1]=buttord(wp/(fs/2),ws/(fs/2),rp,rs);
[b,a]=butter(n1,wn1);
u1=filter(b,a,u);
p=0.8503*mean((u1.^2)) ;
fj=20e6;fs=8*fj;Tr=520e-6;bj=5e6;
t1=0:1/fs:3*Tr-1/fs;N=length(t1);
u=wgn(1,N,wpp);
df1=fs/N;n=0:N/2;f=n*df1;
wp=10e6;ws=14e6;rp=1;rs=60;
[Nn,wn]=buttord(wp/(30e6/2),ws/(30e6/2),rp,rs);
[b,a]=butter(Nn,wn);
figure;subplot(2,2,1),plot(t1,u1),title('噪声信号波形');axis([0,2e-6,-2,2]);xlabel('时间(s)');ylabel('幅度(V)');
subplot(2,2,2),j2=fft(u1); plot(f,10*log10(abs(j2(n+1)*2/N)));xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声信号功率谱');axis([0,4e7,-80,0]);
i=1:N-1;ss=cumsum([0 u1(i)])
ss=ss*Tr/N;
y=uj*cos(2*pi*fj*t1+2*pi*mf*bj*ss*10);%uj=1 是输出的噪声调频信号的幅度  fj是调制信号中心频率是20M    增加调制指数*10 让波形明显
subplot(2,2,3), plot(t1,y),title( '噪声调频信号波形'),axis([0,2e-6,-1.5,1.5]);xlabel('时间(s)');ylabel('幅度(V)');
y=uj*cos(2*pi*fj*t1+2*pi*mf*bj*ss);%uj=1 是输出的噪声调频信号的幅度  fj是调制信号中心频率是20M  
subplot(2,2,4),J=fft(y);plot(f,10*log10(abs(J(n+1))));axis([0,4e7,-20,60]);xlabel('频率(Hz)');ylabel('功率(dBW)');axis([0,4e7,-20,50]);title( '噪声调频信号功率谱')
​

单音干扰

%% 单音信号
figure
Fs=20000;  %采样频率
N=20000;    %采样点
n=0:N-1;t=n/Fs;  %时间序列
fc=1000;  %载波信号频率 
f=n*Fs/N;  %频率 
Uc=1*sin(2*fc*pi*t);     %载波信号 
C1=fft(Uc);             %对载波信号进行傅里叶变换 
cxf=abs(C1);           %进行傅里叶变换  
cxf=cxf/max(cxf);%归一化
subplot(3,1,1);plot(t,Uc);title('载波信号波形');xlabel('时间(s)');ylabel('幅度(V)');title('单音干扰信号波形');axis([0 0.009 -1 1]);
subplot(3,1,2); plot(f(1:N/2),cxf(1:N/2));title('载波信号频谱'); axis([0 2000 0 1]);xlabel('频率(Hz)');ylabel('功率');title('单音干扰信号归一化功率谱');
set(gca,'YTick',0:1:1);%设置功率谱坐标轴只有0和1

多音干扰

%% 多音信号
figure
Fs=200000;  %采样频率
N=200000;    %采样点
n=0:N-1;t=n/Fs;  %时间序列
A0=1;  %信号振幅 
fc=1000;  %信号中间频率 
f=n*Fs/N;  %信号步进频率
w0=2*fc*pi; 
step=2*pi*50;
Uc=A0*cos(w0*t)+A0*cos((w0+step)*t)++A0*cos((w0+2*step)*t)++A0*cos((w0+3*step)*t)+A0*cos((w0-step)*t)++A0*cos((w0-2*step)*t)++A0*cos((w0-3*step)*t);%多音信号 
C1=fft(Uc);      %对信号进行傅里叶变换 
cxf=abs(C1);     %求绝对值
cxf=cxf/max(cxf);%归一化
subplot(2,1,1);plot(t,Uc);xlabel('时间(s)');ylabel('幅度(V)');title('多音信号波形');axis([0 0.1 -8 8]);
subplot(2,1,2);plot(f(1:N/2),cxf(1:N/2));title('载波信号频谱');axis([0 2000 0 1]);xlabel('频率(Hz)');ylabel('功率');title('多音信号归一化功率谱');
set(gca,'YTick',0:1:1);%设置功率谱坐标轴只有0和1

线性扫频干扰

%% 线性扫频信号
figure
t=0:0.00001:3-0.00001;%3对应3个周期,0.00001为精度
f0=5;%扫频起始频率
fe=100;%扫频截止频率
x=chirp(mod(t,1),f0,1,fe);%1代表的是单周期时间
subplot(3,1,1);plot(t,x);title('三个周期的线性扫频信号波形');xlabel('时间(s)');ylabel('幅度(V)');
​
ft=f0+(fe-f0)*mod(t,1);
subplot(3,1,2);plot(t,ft);title('线性扫频信号频率-时间图');xlabel('时间(s)');ylabel('频率(Hz)');
​
t=0:0.00001:1-0.00001;%求频谱时不能对多周期的求,对1个周期进行FFT
x=chirp(t,f0,1,fe);
C1=fft(x);     %对载波信号进行傅里叶变换 
cxf=abs(C1);    %求绝对值
cxf=cxf/max(cxf);%归一化
subplot(3,1,3);plot(cxf); axis([0 150 0 1]);title('线性扫频信号归一化频谱');xlabel('频率(Hz)');ylabel('功率');

2ASK

%% 2ASK
N=10;%
仿真
10
S的时间
xn=[];
x=[1 0 1 1 0 0 1 0 1 0];%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%以1ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);
else
xn(i*1000-999:i*1000)=zeros(1,1000);
end
end
y=cos(2*pi*3*t);%载波波形 频率为3Hz
z=xn.*y;%载波调制
subplot(3,1,1);plot(xn);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(3,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(3,1,3);plot(z);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);

2FSK

%% 2fsk
figure
N=10;%
仿真
10
S的时间
xn=[];xn1=[];
x=[1 0 1 1 0 0 1 0 1 0];%%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%
以
1
ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);%xn都置为0
xn1(i*1000-999:i*1000)=zeros(1,1000);%xn1都置为1
else
xn(i*1000-999:i*1000)=zeros(1,1000);%xn都置为1
xn1(i*1000-999:i*1000)=ones(1,1000);%xn1都置为0
end
end
y=cos(2*pi*2*t);%载波波形1 频率为2Hz
y2=cos(2*pi*6*t);%载波波形2 频率为6Hz
F1=xn.*y; %加入载波1
F2=xn1.*y2; %加入载波2
e_fsk=F1+F2;%叠加
figure(1);heigth=160;width=160;set(gcf,'Position',[0 0 width/0.277 heigth/0.277]);%前面是图片在屏幕的位置,后面是图片大小为20*20
subplot(4,1,1);plot(xn);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(4,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(4,1,3);plot(y2);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(414);plot(e_fsk);title('2FSK信号');axis([0 10000 -1 1]);xlabel('时间(ms)');ylabel('幅度(V)');

BPSK

%% BPSK
figure
N=10;%
仿真
10
S的时间
xn=[];xn1=[];
x=[1 0 1 1 0 0 1 0 1 0];%每秒一个逻辑值,一共10个
t=0.001:0.001:N;%以1ms为步进
for i=1:N
if x(i)==1
xn(i*1000-999:i*1000)=ones(1,1000);
xn1(i*1000-999:i*1000)=ones(1,1000);%码元值都为1
else
xn(i*1000-999:i*1000)=-ones(1,1000);
xn1(i*1000-999:i*1000)=zeros(1,1000);%码元值都为0
end
end
y=sin(2*pi*1*t);%载波波形 频率为3Hz   与前面的不一样,为正弦波
z=xn.*y;%载波调制
subplot(3,1,1);plot(xn1);title(' 基带信号');xlabel('时间(ms)');ylabel('逻辑值');axis([0 10000 -0.2 1.2]);
set(gca,'YTick',-1:1:1);%设置逻辑值坐标轴只有0和1
subplot(3,1,2);plot(y);title(' 载波波形');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);
subplot(3,1,3);plot(z);title(' 2ASK信号');xlabel('时间(ms)');ylabel('幅度(V)');axis([0 10000 -1 1]);

QAM

%%  QAM
​
clc;clear all;
nsymbol=100000;%表示一共有多少个符号,这里定义100000个符号
M=16;%M表示QAM调制的阶数,表示16QAM,16QAM采用格雷映射(所有星座点图均采用格雷映射)
N=64;
graycode=[0 1 3 2 4 5 7 6 12 13 15 14 8 9 11 10];%格雷映射编码规则
graycode1=[0 1 3 2 6 7 5 4 8 9 11 10 14 15 13 12 24 25 27 26 30 31 29 28 16 17 19 18 22 23 21 20 48 49 51 50 54 55 53 52 56 57 59 58 62 63 61 60 40 41 43 42 46 47 45 44 32 33 35 34 38 39 37 36];%格雷映射十进制的表示
EsN0=5:20;%信噪比范围
snr1=10.^(EsN0/10);%将db转换为线性值
msg=randi([0,M-1],1,nsymbol);%0到15之间随机产生一个数,数的个数为:1乘nsymbol,得到原始数据
msg1=graycode(msg+1);%对数据进行格雷映射
msgmod=qammod(msg1,M);%调用matlab中的qammod函数,16QAM调制方式的调用(输入0到15的数,M表示QAM调制的阶数)得到调制后符号
​
scatterplot(msgmod);%调用matlab中的scatterplot函数,画星座点图
spow=norm(msgmod).^2/nsymbol;%取a+bj的模.^2得到功率除整个符号得到每个符号的平均功率
% 64QAM
nsg=randi([0,N-1],1,nsymbol);
nsg1=graycode1(nsg+1);
nsgmod=qammod(nsg1,N);
scatterplot(nsgmod);%调用matlab中的scatterplot函数,画星座点图
spow1=norm(nsgmod).^2/nsymbol;
​
for i=1:length(EsN0)
    sigma=sqrt(spow/(2*snr1(i)));%16QAM根据符号功率求出噪声的功率
    sigma1=sqrt(spow1/(2*snr1(i)));%64QAM根据符号功率求出噪声的功率
    rx=msgmod+sigma*(randn(1,length(msgmod))+1i*randn(1,length(msgmod)));%16QAM混入高斯加性白噪声
    rx1=nsgmod+sigma*(randn(1,length(nsgmod))+1i*randn(1,length(nsgmod)));%64QAM混入高斯加性白噪声
    y=qamdemod(rx,M);%16QAM的解调
   y1=qamdemod(rx1,N);%64QAM的解调
   decmsg=graycode(y+1);%16QAM接收端格雷逆映射,返回译码出来的信息,十进制
   decnsg=graycode1(y1+1);%64QAM接收端格雷逆映射
   [err1,ber(i)]=biterr(msg,decmsg,log2(M));%一个符号四个比特,比较发送端信号msg和解调信号decmsg转换为二进制,ber(i)错误的比特率
   [err2,ser(i)]=symerr(msg,decmsg);%16QAM求实际误码率
   [err1,ber1(i)]=biterr(nsg,decnsg,log2(N));
   [err2,ser1(i)]=symerr(nsg,decnsg);%64QAM求实际误码率
end
% 16QAM
scatterplot(rx);%调用matlab中的scatterplot函数,画rx星座点图
p = 2*(1-1/sqrt(M))*qfunc(sqrt(3*snr1/(M-1)));
ser_theory=1-(1-p).^2;%16QAM理论误码率
ber_theory=1/log2(M)*ser_theory;
​
% 64QAM
scatterplot(rx1);
p1=2*(1-1/sqrt(N))*qfunc(sqrt(3*snr1/(N-1)));
ser1_theory=1-(1-p1).^2;%64QAM理论误码率
ber1_theory=1/log2(N)*ser1_theory;%得到误比特率
​
% 绘图
figure()
semilogy(EsN0,ber,'o', EsN0, ser, '*',EsN0, ser_theory, '-', EsN0, ber_theory, '-');
title('16-QAM载波调制信号在AWGN信道下的误比特率性能')
xlabel('EsN0');
ylabel('误比特率和误符号率');
legend('误比特率', '误符号率','理论误符号率','理论误比特率');
% 阶数不同,16和64QAM调制信号在AWGN信道的性能比较
figure()
semilogy(EsN0,ser_theory,'o',EsN0,ser1_theory,'o');%ber ser比特仿真值 ser1理论误码率 ber1理论误比特率
title('16和64QAM调制信号在AWGN信道的性能比较');grid;
xlabel('Es/N0(dB)');%性躁比
ylabel('误码率');%误码率
legend('16QAM理论误码率','64QAM理论误码率');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARMxy工控机使用Node-Red教程:实现Modbus转MQTT协议二次开发(8)

Modbus/TCP与MQTT通信案例 7.1 案例说明 案例功能:使用node-red工具通过Modbus/RTU协议采集M160T IO模块数据,再经过MQTT协议的转换上传到上位机Ubuntu。基于 node-red 部署程序,实现获取 M160T IO 模块数据上传到上位机。 图 98 7.2 案例…

TeleVis:基于NLP的新冠新闻舆情可视化项目

关联比赛: 疫情数据可视化公益行动 一、项目名称 TeleVis:基于NLP的新冠新闻舆情可视化项目 二、团队信息 团队名称:TeleVis 单 位:金融壹账通大数据研究院 成 员:杨镭、郭凌峰、王天宇、黄北辰、齐婧含 三、项目介绍 政企机构的…

AST 基础

目录 AST 的基本结构安装 babel 库babel 中的组件parse 与 generatorparsegenerator完整代码 traverse 与 visitortraversevisitor 的定义方式path 对象中的 traverse types判断节点类型生成新的节点valueToNode(方便的生成字面量) path 对象(重点)path …

C++——多态经典案例(三)计算器

案例:使用多态实现一个简单的计算器,计算两个数的加减乘除结果 分析:定义一个抽象类AbstractCalc ,其内部定义一个纯虚函数getResult,用于得到计算结果 定义加减乘除四个类,分别继承这个抽象类AbstractCal…

prometheus 简单监控etcd

确保etcd已经开启/metrics如下: curl --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key https://192.168.0.54:2379/metrics -k | more创建证书的secret资源 kubectl -n istio-system create secret generic etcd-certs --f…

C++中的string的介绍(从string到STL)

C中的string的介绍 文章目录 C中的string的介绍1. 从string到STL2. string 的构造函数3. string 的iterator(迭代器)4. string 中的元素访问5. string 中容量相关6. string 中的插入删除7. string 中的查找8. string 的剩余函数 1. 从string到STL 严格来…

crm客户管理系统有哪些?盘点大家使用最广泛的15款

将对比的客户管理CRM系统包括:纷享销客、Zoho CRM、销售易、用友CRM、Salesforce、Microsoft Dynamics 365、销帮帮CRM、HubSpot、Oracle CRM、悟空CRM、神州云动CRM、红圈CRM、SAP CRM、Odoo、OroCRM。 一个合适的CRM系统可以极大地提高你的销售效率和客户满意度&a…

C语言——预处理和指针

C语言——预处理和指针 预处理宏宏定义宏的作用域带参的宏 文件包含条件编译 指针指针的概念指针的定义 预处理 编程的流程分为:编辑、编译、运行、调试四个阶段; 预处理属于编译阶段,编译过程又可以分为:预处理、编译、汇编、链…

新160个crackme - 022-CM_2

运行分析 需破解Name和Serial,输入的小写字母都会变为大写字母 PE分析 C程序,32位,无壳 静态分析&动态调试 发现关键字符串 ida动态调试,发现Name和Serial长度需要大于5,且Serial前6位明文爆出,6287-A …

YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切

原文:YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切 - 知乎 (zhihu.com) 一、SAM 分割任何模型 (Segment Anything Model - SAM) 是一种突破性的图像分割模型,可实现具有实时性能的快速分割。 项目地址 https://github.com/facebookresearch/segment-…

第 8 章 虚拟文件系统(5)

目录 8.4 处理VFS对象 8.4.1 文件系统操作 本专栏文章将有70篇左右,欢迎关注,查看后续文章。 8.4 处理VFS对象 8.4.1 文件系统操作 文件系统可以编译为模块。 使用文件系统前需先注册。 1. 注册文件系统 int register_filesystem( struct file_…

Scrapy爬虫框架介绍、创建Scrapy项目

Scrapy官网:https://scrapy.org/ 什么是Scrapy Scrapy 是一个基于 Python 的快速的高级网页抓取和网页爬取框架,用于抓取网站并从其页面中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 Scrapy核心组件 1. Scrapy Engin…

【Linux学习】文件系统 - 第二篇

🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊 文章目录 💡文件操作的系统接口🍑open系统调用⚡close系统调用🦈write系统调用🦅read系统调…

在开关电源转换器中充分利用碳化硅器件的性能优势

在过去的几十年中,半导体行业已经采取了许多措施来改善基于硅 MOSFET (parasitic parameters),以满足开关转换器(开关电源)设计人员的需求。行业效率標準以及市场对效率技术需求的双重作用,导致了对于可用于构建更高效…

Mysql中事务的读一致性问题,以及如何用MVCC解决

事务四大特性的实现: 原子性事务具有回滚的能力,InnoDB引擎使用undo log日志表来进行回滚操作。 持久性InnoDB引擎使用redo log日志表来保证数据的持久性。 事务的隔离性产生的问题: 脏读:一个事务读取到了另一个事务未提交的数…

Qt WebEngine播放DRM音视频

Qt WebEngine播放DRM受保护视频,前提是Qt WebEngine开启音视频编码器,能够支持网页上普通视频的播放。开启音视频编码器需要自己编译源码,这里不做介绍。 什么是DRM音视频 DRM视频是指数字版权管理(Digital Rights Management&a…

70.加载功能菜单功能设计

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:易道云信息技术研究院 上一个内容:69.搭建分析工具界面 以 69.搭建分析工具界面 它的代码为基础进行修改 效果图&#xf…

gif压缩大小但不改变画质?为网站性能加速的必备知识

在互联网时代,GIF 动图以其生动的表现力和视觉效果,在社交媒体、网站设计、数字营销等领域被广泛应用。然而,随之而来的一个问题是,GIF 文件的体积往往较大,这可能会导致网站加载速度变慢,影响用户体验。因…

练习实践-基础设施:搭建时钟同步服务器-基于chrony软件在centos7系统上的实现

参考来源:B站视频:up主:林哥讲运维 【一分钟学会:使用 chrony 部署企业 NTP 时间服务器】 https://chrony-project.org/comparison.html --chrony组织的比较 https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中,我们发现大家最关心的问题从来不是某个具体的功能如何使用,而是面对一个具体的实战场景时,如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…