首页 > 其他分享 >PAM咨询——还是得靠自己

PAM咨询——还是得靠自己

时间:2023-11-05 16:44:05浏览次数:27  
标签:还是 signal EbN0 sample rate 咨询 bit PAM dou

%定义参数
M = 2;    %定义为M元调制
Rs = 1000; % 定义波特率
Rb = Rs*log2(M); %计算比特率
Ts = 1/Rs;   %计算符号发送间隔
sample_rate = 100*Rs; % 采样率
EbN0 =0:15;%传送每个比特所用能量平均值/噪声单边功率谱密度(单位:dB)

% 生成随机比特序列
num_bits = 100000;% 比特数
bit_sequence = randi([0, 1], 1, num_bits);
bit_sequence_dou = bit_sequence*2-1;
t_origin = (0:num_bits-1)*Ts; %显示时间(按发送间隔)

% ber = zeros(1,length(EbN0));
% ber_dou =zeros(1,length(EbN0));

%设置矩形脉冲NRZ发送滤波器
% 脉冲的幅度
A = 1; 
% 生成时间向量
t_sendfilter = 0:1/sample_rate:Ts-1/sample_rate;
% 生成矩形脉冲滤波器
rect_pulse_filter = [A * ones(1, length(t_sendfilter))];

% 上采样发送序列(每个数据后添0)
upsampled_bits = zeros(1, length(bit_sequence)*sample_rate*Ts);
upsampled_bits(1:sample_rate*Ts:end) = bit_sequence;
t_upsampled = 0:1/sample_rate:(length(upsampled_bits)-1)/sample_rate;
%Double
upsampled_bits_dou = zeros(1, length(bit_sequence_dou)*sample_rate*Ts);
upsampled_bits_dou(1:sample_rate*Ts:end) = bit_sequence_dou;

% 将上采样的发送序列通过滤波器
s_rz = conv(upsampled_bits, rect_pulse_filter, 'full');
s_rz = s_rz(1:sample_rate/Rs*num_bits);

% 将上采样的发送序列通过滤波器 Double
s_rz_dou = conv(upsampled_bits_dou, rect_pulse_filter, 'full');
s_rz_dou = s_rz_dou(1:sample_rate/Rs*num_bits);

% 生成时间向量
t_send = (0:length(s_rz)-1) / sample_rate;
% %求s_rz的功率谱
% [P_srz, f_srz] = periodogram(s_rz,[],[],sample_rate);

for indx=1:length(EbN0)
%加噪声
s_rz_noise=awgn(s_rz,EbN0(indx)+10*log10(2*Rb/sample_rate),'measured');
s_rz_noise_dou = awgn(s_rz_dou,EbN0(indx)+10*log10(2*Rb/sample_rate),'measured');
%LPF
% d = designfilt('lowpassfir', 'FilterOrder', 50,  'CutoffFrequency', 2*Rs, 'SampleRate', sample_rate);
% y_first = filter(d, s_rz_noise);
% % y_first = conv(s_rz_noise, b);          % 通过滤波器  
% y = y_first(n/2+1:end-n/2);     % 移除滤波器产生的过渡带  

d = designfilt('lowpassfir', 'FilterOrder', 80,  'CutoffFrequency', 2*Rs, 'SampleRate', sample_rate);
y = filter(d, s_rz_noise);

% 验证基带信号带宽B
% passband = [0 2*Rs]; % 通带频率范围
% original_signal = s_rz_noise;
% fs = sample_rate;
%     % 使用傅里叶变换将modulated_signal转换为频域表示  与前面画频谱的时候是一样的操作 但是不在乎复杂度 hhh
% original_signal_spectrum = fftshift(fft(original_signal));
%     % 确定要保留的频率范围,将其他频率分量置零
% f1 = (-fs/2 : fs/length(original_signal) : fs/2 - fs/length(original_signal));
% original_signal_spectrum(abs(f1) < passband(1) | abs(f1) > passband(2)) = 0;
% filtered_signal_spectrum = original_signal_spectrum;
%     % 使用逆傅里叶变换将修改后的频域信号转换回时域表示
% filtered_original_signal = ifft(ifftshift(filtered_signal_spectrum));
% y = filtered_original_signal;
%采点
rn = y(Ts*sample_rate/2:Ts*sample_rate:num_bits*Ts*sample_rate);

% 生成时间向量2
t_rev = (0:length(y)-1) / sample_rate;

%判决
%计算门限值
threshold = 0.5;

rev_bit_sequences = zeros(1, length(rn)); % 预分配决策向量的空间

for i = 1:length(rn)
    if rn(i) > threshold
        rev_bit_sequences(i) = 1;
    else
        rev_bit_sequences(i) = 0;
    end
end



% original_signal_dou = s_rz_noise_dou;
% original_signal_spectrum_dou = fftshift(fft(original_signal_dou));
%     % 确定要保留的频率范围,将其他频率分量置零
% f1_dou = (-fs/2 : fs/length(original_signal_dou) : fs/2 - fs/length(original_signal_dou));
% original_signal_spectrum_dou(abs(f1_dou) < passband(1) | abs(f1_dou) > passband(2)) = 0;
% filtered_signal_spectrum_dou = original_signal_spectrum_dou;
%     % 使用逆傅里叶变换将修改后的频域信号转换回时域表示
% filtered_original_signal_dou = ifft(ifftshift(filtered_signal_spectrum_dou));
% y_dou = filtered_original_signal_dou;
%采点

d = designfilt('lowpassfir', 'FilterOrder', 80,  'CutoffFrequency', 2*Rs, 'SampleRate', sample_rate);
y = filter(d, s_rz_noise_dou);
rn_dou = y_dou(Ts*sample_rate/2:Ts*sample_rate:num_bits*Ts*sample_rate);

rev_bit_sequences_dou = zeros(1, length(rn_dou)); % 预分配决策向量的空间

for i = 1:length(rn)
    if rn_dou(i) > 0
        rev_bit_sequences_dou(i) = 1;
    else
        rev_bit_sequences_dou(i) = -1;
    end
end
%计算误比特率
[numErrors, ber80(indx)] = biterr(bit_sequence, rev_bit_sequences);
error_count80(indx) = ;
ber_dou80(indx) = error_count80(indx) / length(bit_sequence);
bit_error_theory80(indx) =qfunc(sqrt((10.^(EbN0(indx)/10))/2));
bit_error_dou80(indx)=qfunc(sqrt((10.^(EbN0(indx)/10))));
end

%以下绘图
figure;
plot(EbN0, ber, '-r*', EbN0, ber_dou, '-k*', EbN0, bit_error_theory, '-ro',EbN0, bit_error_dou, '-ko');
title('2-PAM信号在AWGN信道下的性能(线性坐标)')
xlabel('Eb/N0(dB)');ylabel('误符号率')
legend('单极性误比特率','双极性误比特率','单极性理论误比特率','双极性理论误比特率')
grid  on

figure;
semilogy(EbN0,bit_error_theory,'-ro',EbN0,ber,'-co',EbN0,ber200,'-r*',EbN0,ber80,'-k^',EbN0,ber70,'-g*',EbN0,ber60,'-c*',EbN0,ber1,'-k*',EbN0,ber40,'-m*',EbN0,ber30,'-b*',EbN0,ber20,'-y*');
title('2-PAM信号在AWGN信道下的性能(对数坐标)')
xlabel('Eb/N0(dB)');ylabel('误符号率')
legend('理论误比特率','误比特率-理想LPF','误比特率-200阶','误比特率-80阶','误比特率-70阶','误比特率-60阶','误比特率-50阶','误比特率-40阶','误比特率-30阶','误比特率-20阶')
grid  on

关于实现低通滤波器 一定要考虑延时 收、发节拍一定要猜准

标签:还是,signal,EbN0,sample,rate,咨询,bit,PAM,dou
From: https://www.cnblogs.com/LYoungH/p/17810693.html

相关文章

  • gitlab服务器-最后还是删除了
    在自己的服务器上搭建了一个gitlab服务,发现这玩意太耗资源,还是删除了吧,用免费的github或gitee吧。 https://blog.csdn.net/weixin_48227918/article/details/131749359?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169916099116800192260466%2522%252C%2522scm%2......
  • 程序员笔记本电脑选 windows 还是 MAC
    计算机选择是每个进入IT行业同学的第一个重要选择,那么你是怎么选择的呢?选择操作系统(Windows还是macOS)取决于程序员的需求、偏好和工作流程。每个操作系统都有其优点和缺点,下面将分别讨论它们,以帮助你做出决策。视频:https://www.bilibili.com/video/BV13c411d7eK/Windows:**......
  • count++是先用后加还是先加后用
    在表达式count++中,++是后缀自增运算符,它的运算顺序是先使用变量的当前值,然后再将变量的值加1。换句话说,在执行count++表达式时,会先返回count的当前值,然后再将count的值加1。以下是一个示例代码,演示了count++表达式的运行过程:publicclassIncrementExample{public......
  • Linux PAM和AppArmor
    PAM介绍PAM全称叫作PluggableAuthenticationModules,译为可插拔验证模块。1995年起源于sun公司,PAM是一个框架,通过PAM框架提供的接口,应用程序可以不关心基层具体的实现过程,直接调用接口实现身份验证功能。PAM还有一个功能就是在用户空间就是先对用户的资源进行限制。PAM不是Lin......
  • 查询Linux设备是固态磁盘还是机械磁盘方法。
    方法一判断cat/sys/block//queue/rotational的返回值(其中为你的硬盘设备名称,例如sda等等),如果返回1则表示磁盘可旋转,那么就是HDD了;如果返回0,则表示磁盘不可以旋转,那么就是SSD了。cat/sys/block/sda/queue/rotational0#表明sda这块硬盘是......
  • 选择做APP还是做网页?该怎么选择?
    哈喽大家好,咱们又见面了,我是咕噜铁蛋,现在移动互联网时代,将业务和服务通过手机应用或网站呈现给用户已成为企业常见的做法。然而,许多企业在决策时犯了难,无法确定是选择开发APP还是网站。所以今天在这篇文章铁蛋将为大家提供几点思考的指导,以便在做出决策时有更多依据。一、用户特征......
  • 查看linux操作系统版本:Ubuntu?Centos?还是其他?
    查看内核版本和操作系统版本:uname-a查看系统架构:uname-m查看系统主机名:hostname查看当前登录用户:whoami查看系统已安装的软件包列表:dpkg-l查看系统内存使用情况:free-h查看系统磁盘使用情况:df-h查看系统CPU使用情况:top查看系统网络连接状态:ifconfig查看系统已安装的软件包数量:a......
  • mybatis-plus的in,是传Array还是传List?仔细一看方法签名,瞬间秒懂
    springboot项目通常配合mybatisplus来做数据CRUD。我们在查询或更新数据的时候,有时要用到in来过滤数据。比如SELECT*FROMemax_scbg_orderWHEREorder_noIN(1305679009380433922,1305405259472830465)mybatisplus中关于in方法的使用,在传多个字段值的时候,我们经常搞不清是传Arr......
  • 回文自动机(PAM)的简单应用
    记录回文自动机的一些应用实例​ 题目主要来源模板​ 跑\(PAM\)就是构建两棵字典树,字典树上(奇偶)根到不同节点都对应了一个原串中本质不同的回文串,同时维护了每个回文串对应的最长回文后缀。​ 这个模板定义节点\(0\)为偶根,节点\(1\)为奇根(有些板子可能反过来)\(next[i][j]\):当......
  • js中字符串使用单引号还是双引号
    ES6如下描述:字符串静态字符串一律使用单引号或反引号,不使用双引号。动态字符串使用反引号。//badconsta="foobar";constb='foo'+a+'bar';//acceptableconstc=`foobar`;//goodconsta='foobar';constb=`foo${a}bar`;......