matlab做ufmc与ofdm对比仿真代码
时间: 2023-08-05 15:09:44 浏览: 90
以下是 MATLAB 代码示例,用于比较 UFMC 和 OFDM 的性能。
首先,我们定义一些参数,例如子载波数量、符号长度、过渡带长度等。
```matlab
nSubcarriers = 64; % 子载波数量
nSymbols = 100; % 符号长度
nCyclicPrefix = 16; % 循环前缀长度
nTransition = 6; % 过渡带长度
```
接下来,我们生成随机的 QPSK 符号,并将其编码到 OFDM 和 UFMC 符号中。
```matlab
% OFDM 符号
ofdmSymbols = randi([0 3],nSubcarriers,nSymbols)*2-3; % 生成 QPSK 符号
ofdmTx = ifft(ofdmSymbols); % IFFT 变换
ofdmTx = [ofdmTx(end-nCyclicPrefix+1:end,:); ofdmTx]; % 添加循环前缀
% UFMC 符号
ufmcSymbols = randi([0 3],nSubcarriers+nTransition,nSymbols)*2-3; % 生成 QPSK 符号
ufmcTx = zeros(nSubcarriers+nCyclicPrefix,nSymbols); % 初始化 UFMC 符号
for i=1:nSymbols
ufmcTx(:,i) = ifft(ufmcSymbols(:,i)); % IFFT 变换
ufmcTx(:,i) = ufmcTx(mod(-nCyclicPrefix:nSubcarriers-1,nSubcarriers)+1,i); % 循环前缀移位
end
```
然后,我们通过添加高斯白噪声来模拟信道,并使用 MMSE 等算法进行信号恢复。
```matlab
% 信道
channel = randn(1,nSymbols+nCyclicPrefix)+1i*randn(1,nSymbols+nCyclicPrefix); % 随机信道
channel = channel./abs(channel); % 归一化
ofdmRx = channel.*ofdmTx + 0.1*randn(size(ofdmTx)); % 添加高斯白噪声
ufmcRx = channel.*ufmcTx + 0.1*randn(size(ufmcTx)); % 添加高斯白噪声
% MMSE 等算法
ofdmRx = fft(ofdmRx); % FFT 变换
ufmcRx = fft(ufmcRx); % FFT 变换
ufmcSymbolsHat = zeros(size(ufmcSymbols)); % 初始化 UFMC 符号
for i=1:nSymbols
ufmcSymbolsHat(:,i) = linsolve(channel'*channel + 0.01*eye(size(channel,2)),channel'*ufmcRx(:,i)); % MMSE 等算法
end
ofdmSymbolsHat = ofdmRx; % OFDM 符号恢复
```
最后,我们计算误码率并绘制 BER-SNR 曲线。
```matlab
% BER-SNR 曲线
snrRange = 0:2:30; % 信噪比范围
berOfdm = zeros(size(snrRange)); % 初始化 OFDM 误码率
berUfmc = zeros(size(snrRange)); % 初始化 UFMC 误码率
for i=1:length(snrRange)
ofdmRx = channel.*ofdmTx + 10^(-snrRange(i)/20)*randn(size(ofdmTx)); % 添加高斯白噪声
ufmcRx = channel.*ufmcTx + 10^(-snrRange(i)/20)*randn(size(ufmcTx)); % 添加高斯白噪声
ofdmSymbolsHat = ofdmRx; % OFDM 符号恢复
ufmcSymbolsHat = zeros(size(ufmcSymbols)); % 初始化 UFMC 符号
for j=1:nSymbols
ufmcSymbolsHat(:,j) = linsolve(channel'*channel + 10^(-snrRange(i)/10)*eye(size(channel,2)),channel'*ufmcRx(:,j)); % MMSE 等算法
end
berOfdm(i) = sum(sum(abs(ofdmSymbols-ofdmSymbolsHat)>0))/numel(ofdmSymbols); % OFDM 误码率
berUfmc(i) = sum(sum(abs(ufmcSymbols-ufmcSymbolsHat)>0))/numel(ufmcSymbols); % UFMC 误码率
end
semilogy(snrRange,berOfdm,'-o',snrRange,berUfmc,'-x');
legend('OFDM','UFMC');
xlabel('SNR (dB)');
ylabel('BER');
```
这样,我们就完成了 UFMC 和 OFDM 的比较仿真。
阅读全文