matlab做ufmc与ofdm对比仿真代码
时间: 2023-08-05 18:09:44 浏览: 83
UFMC和OFDM的信号频谱,星座图的MATLAB对比仿真+含代码操作演示视频
5星 · 资源好评率100%
以下是MATLAB中用于UFMC和OFDM系统的基本仿真代码,以便进行比较:
UFMC
```matlab
clear all;
close all;
% 基本参数设置
N = 1024; % 子载波个数
L = 4; % 折叠因子
K = N / L; % 子载波组数
M = 4; % 调制阶数
Lcp = 72; % 循环前缀长度
% 随机生成数据
tx_data = randi([0 M-1], K, L);
% 调制
tx_data_mod = qammod(tx_data, M);
% UFMC参数设置
N1 = N + 2*Lcp; % 带状宽度
h = fir1(N1-1, 1/K); % 滤波器系数
% 时域信号生成
tx_data_mod_ifft = ifft(tx_data_mod, N, 2); % FFT变换
tx_data_mod_ifft_zp = [tx_data_mod_ifft(:, end-Lcp+1:end), tx_data_mod_ifft]; % 加循环前缀
tx_data_mod_ifft_zp_filt = filter(h, 1, tx_data_mod_ifft_zp, [], 2); % 滤波
tx_data_mod_ifft_zp_filt = tx_data_mod_ifft_zp_filt(:, N1:end); % 去掉滤波器延迟
% 信道
h_ch = randn(1, K) + 1j * randn(1, K);
rx_data_mod_ifft_zp_filt = tx_data_mod_ifft_zp_filt .* repmat(h_ch, L, 1);
% 接收端处理
rx_data_mod_ifft_zp_filt_cp = [rx_data_mod_ifft_zp_filt(:, end-Lcp+1:end), rx_data_mod_ifft_zp_filt];
rx_data_mod_fft = fft(rx_data_mod_ifft_zp_filt_cp(:, Lcp+1:Lcp+N), [], 2);
rx_data_demod = qamdemod(rx_data_mod_fft, M);
% BER计算
ber = sum(xor(tx_data(:), rx_data_demod(:))) / (K * L);
fprintf('BER:%f\n', ber);
```
OFDM
```matlab
clear all;
close all;
% 基本参数设置
N = 1024; % 子载波个数
M = 4; % 调制阶数
Lcp = 72; % 循环前缀长度
% 随机生成数据
tx_data = randi([0 M-1], N, 1);
% 调制
tx_data_mod = qammod(tx_data, M);
% OFDM参数设置
N1 = N + Lcp; % 带状宽度
% 时域信号生成
tx_data_mod_ifft = ifft(tx_data_mod, N, 1); % FFT变换
tx_data_mod_ifft_zp = [tx_data_mod_ifft(end-Lcp+1:end, :); tx_data_mod_ifft]; % 加循环前缀
% 信道
h_ch = randn(1, N) + 1j * randn(1, N);
rx_data_mod_ifft_zp = tx_data_mod_ifft_zp .* repmat(h_ch, 1, 1);
% 接收端处理
rx_data_mod_ifft_zp_cp = [rx_data_mod_ifft_zp(end-Lcp+1:end, :); rx_data_mod_ifft_zp];
rx_data_mod_fft = fft(rx_data_mod_ifft_zp_cp, [], 1);
rx_data_demod = qamdemod(rx_data_mod_fft, M);
% BER计算
ber = sum(xor(tx_data(:), rx_data_demod(:))) / N;
fprintf('BER:%f\n', ber);
```
可以看到,两者的主要区别在于时域信号生成部分的不同。UFMC使用了一个可变带宽的滤波器,而OFDM使用了基于FFT的方法。其他部分基本相同。
阅读全文