2021-08-26

数字信号处理:QAM调制与解调实现
该博客详细展示了数字信号处理的过程,包括NRZ数据生成、QAM调制、上采样、加噪声、匹配滤波解调等步骤,并通过星座图分析了信号质量。最终计算了误码率。
clc;
clear;
close all;

%信号参数
M = 4;                             %码元符号表示的进制数
k = log2(M);                  %码元符号表示的信息量(bit)
n = 2048;                      %要处理的比特流数量
sym = n/k;                    %码元数;符号率
Rb = 1e6;                     %比特率
Rs = Rb/k;                    %码元速率
Fs = 32e6;                    %采样速率
Ts = 1/Fs;                      %采样时间间隔
fc = 1e6;                       %载波

% 整形滤波参数
beta = 0.25;
span = 10;
rrc_sps = 4;
rrcfilter = rcosdesign(beta,span,rrc_sps);

% 中频上采样
if_sps = 4;
lpfilt = designfilt('lowpassfir', 'PassbandFrequency', .25, 'StopbandFrequency', .40, 'PassbandRipple', 0.5, 'StopbandAttenuation', 65, 'DesignMethod', 'kaiserwin');

%产生信源
data = randi([0 1],1,n);
data1 = 2*data-1;                       %generate NRZ
data_1 = data1(1:2:end);
data_2 = data1(2:2:end);

msg = ones(size(data_1));
for i = 1:length(data_1)
    if(data_1(i) == 1 && data_2(i) == 1)
        msg(i) =3;
    end
    if(data_1(i) == -1 && data_2(i) == 1)
        msg(i) =1;
    end
    if(data_1(i) == -1 && data_2(i) == -1)
        msg(i) = 0;
    end
    if(data_1(i) == 1 && data_2(i)== -1)
        msg(i) =2;
    end
end

data_modull = complex(data_1 ,data_2);

% 成形滤波
bb_data = upfirdn(data_modull,rrcfilter,rrc_sps);
%scatterplot(bb_data);

%调制
%t = linspace(0,Ts*(length(bb_data)-1));
t = (0:Ts:Ts*(length(bb_data)-1));
si = sin(2 * pi * fc * t);
sq = cos(2 * pi * fc * t);
si_data = si.* bb_data;         
sq_data = sq.* bb_data;  

%上采样
resi_data = resample(si_data,if_sps,1);
firresi_data = filter(lpfilt,resi_data);
resq_data = resample(sq_data,if_sps,1);
firresq_data = filter(lpfilt,resq_data);

%随意加的热噪声
s_data  = firresi_data + firresq_data;
r_bb_data  = s_data + randn(size(s_data)) * 0.01;

% s_data  = si_data + sq_data;
% r_bb_data  = s_data + randn(size(s_data)) * 0.01;

%下采样
res_data1 = resample(r_bb_data,1,if_sps);
firres_data1 = filter(lpfilt,res_data1);

%解调
t = linspace(0,Ts*(length(firres_data1)-1));
t = (0:Ts:Ts*(length(firres_data1)-1));
si1 = sin(2 * pi * fc * t);
sq1 = cos(2 * pi * fc * t);
r_si_data = si1.* firres_data1;
r_sq_data = sq1.* firres_data1;  
r_data = r_si_data + r_sq_data;

% t = (0:Ts:Ts*(length(r_bb_data)-1));
% si1 = sin(2 * pi * fc * t);
% sq1 = cos(2 * pi * fc * t);
% r_si_data = si1.* r_bb_data;
% r_sq_data = sq1.* r_bb_data;  
% r_data = r_sq_data + r_sq_data;

% 匹配滤波
bb_rx_data = upfirdn(r_data,rrcfilter,1,rrc_sps);
scatterplot(bb_rx_data),title('匹配滤波后星座图');
rx_data = qamdemod(bb_rx_data,4);

%计算误比特数
err=length(find(msg~=rx_data(1,sym)));%计算解调信号中错误码元个数
BER_test=err/(sym);%计算误码率
%画图
figure()
subplot(211)
stairs(data_1,'r--o');
hold on
stairs(data_2,'b-');
legend('data_1','data_2');
axis([0 130 -2 2]);
subplot(212)
stairs(rx_data);
axis([0 130 -1 4]);
title('bit信息');

%
%scatterplot(data_modull),title('未处理信息的星座图');
%axis([-2 2 -2 2]);
N = length(r_bb_data);
n = -1*N/2:1:N/2-1;
f = Fs/N*(n-1);
qpsk = 10*log10(abs(fftshift(fft(r_bb_data))).^2)-max(10*log10(abs(fftshift(fft(r_bb_data))).^2));
figure(),
plot(f,qpsk),title('信道中信号');
xlabel('frequency'), ylabel('amplitude');
### 解决 CMake 配置中 `add_executable` 函数使用错误以及 PCD 文件中 `VERSION` 命令未找到的问题 #### 1. CMake 中 `add_executable` 函数的正确配置 在 CMakeLists.txt 文件中,`add_executable` 函数用于定义生成的可执行文件及其对应的源文件。如果出现类似 `CMake Error at CMakeLists.txt:4:Parse error. Expected a newline, got identifier with text "include_directories"` 的错误,则可能是由于语法问题或格式不正确引起的[^1]。 以下是正确的 CMakeLists.txt 示例: ```cmake cmake_minimum_required(VERSION 3.0) project(PointCloudExample) find_package(PCL REQUIRED) # 添加头文件路径 include_directories(${PCL_INCLUDE_DIRS}) # 定义可执行文件及其源文件 add_executable(point_cloud_example src/main.cpp) # 链接 PCL 库 target_link_libraries(point_cloud_example ${PCL_LIBRARIES}) ``` 确保每一行代码后都有适当的换行符,并且 `include_directories` 和 `add_executable` 等命令之间没有多余的空格或错误字符[^1]。 #### 2. PCD 文件中 `VERSION` 命令未找到的问题 PCD 文件中的 `VERSION` 字段用于指定点云数据的版本信息。如果在读取或写入 PCD 文件时出现 `VERSION command not found` 的错误,可能是因为以下原因之一: - **PCD 文件格式不正确**:确保 PCD 文件遵循标准格式。一个典型的 PCD 文件头部应包含以下字段: ```plaintext # .PCD v0.7 - Point Cloud Data file format VERSION 0.7 FIELDS x y z SIZE 4 4 4 TYPE F F F COUNT 1 1 1 WIDTH 100 HEIGHT 1 VIEWPOINT 0 0 0 1 0 0 0 POINTS 100 DATA ascii ``` 如果缺少 `VERSION` 字段或其值不正确,则会导致解析失败[^3]。 - **PCL 版本不兼容**:某些旧版本的 PCL 可能无法正确解析新版 PCD 文件。例如,如果使用的是 PCL 1.8 或更低版本,而 PCD 文件是用更高版本的 PCL 创建的,则可能出现兼容性问题。可以通过升级 PCL 到最新版本来解决此问题[^2]。 #### 3. 编译安装自定义路径下的 PCL 库 如果 PCL 库安装在非标准路径(如 `/usr/local/lib/`),需要手动调整 CMake 配置以确保正确链接库文件。例如: ```bash sudo mv /usr/local/lib/libpcl* /usr/lib/x86_64-linux-gnu/ ``` 然后在 CMakeLists.txt 中添加以下内容: ```cmake link_directories(/usr/lib/x86_64-linux-gnu/) ``` 此外,编译和安装 PCL 时可以指定安装路径,例如: ```bash cd pcl-1.8.0 mkdir release cd release cmake -DCMAKE_BUILD_TYPE=None \ -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_GPU=ON \ -DBUILD_apps=ON \ -DBUILD_examples=ON .. make -j8 sudo make install ``` #### 4. Qt5 路径未找到的问题 如果在配置 VTK 或 PCL 时遇到 `By not providing "FindQt5.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Qt5", but CMake did not find one.` 的错误,可以尝试以下方法解决: - 确保已安装 Qt5 开发库: ```bash sudo apt-get install qt5-default ``` - 在 CMakeLists.txt 中显式指定 Qt5 的路径: ```cmake set(CMAKE_PREFIX_PATH "/usr/lib/x86_64-linux-gnu/cmake/Qt5") find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值