滤波白噪声模型

产生滤波白噪声信道模型,画出信道幅度系数及其包络的概率密度函数与相位的概率密度函数

clear,clf
fm=100;%最大多普勒频率
scale=1e-6;%微秒量级
ts_mu=50;ts=ts_mu*scale;fs=1/ts;%采样时间与采样频率
Nd=1e6;%采样个数
%获得复信道系数
[h,Nfft,Nifft,doppler_coeff]=FWGN_model(fm,fs,Nd);
subplot(211)
plot([1:Nd]*ts,10*log10(abs(h)))%画信道幅度系数
str=sprintf('Clarke/Gan Model,f_m=%d[Hz],T_s=%d[us]',fm,ts_mu);
title(str),axis([0 0.5 -30 5])
subplot(223)
histogram(abs(h),50)%画信道包络概率密度函数,包络一维概率密度函数呈瑞利分布
subplot(224)
histogram(angle(h),50)%画信道相位概率密度函数,相位一维概率密度函数呈均匀分布
%滤波白噪声信道子程序(Clarke/Gan模型),子程序名称:FWGN_model.m
function [h,Nfft,Nifft,doppler_coeff] = FWGN_model(fm,fs,N)
%输入参数:fm为最大多普勒频率,fs为采样频率,N为采样个数
%输出参数:h为复信道系数
Nfft =2^nextpow2(2*fm/fs*N);% nextpow2是用来求指数的,这个指数(假定为a)需满足两个条件:(1)2的a次方大于等于输入值;(2)2的(a-1)次方小于输入值。
Nifft = ceil(Nfft*fs/(2*fm));
%产生独立的复高斯随机过程,参见图2-12
GI=randn(1,Nfft);GQ=randn(1,Nfft);
%求实信号的FFT,以获得Hermitian对称
CGI=fft(GI);CGQ=fft(GQ);%将高斯随机过程转换到频域
%多普勒谱产生,仿真多普勒滤波器
doppler_coeff=Doppler_spectrum(fm,Nfft);
%将转换到频域的高斯过程加入到多普勒滤波器,频域内乘积
f_CGI=CGI.*sqrt(doppler_coeff);
f_CGQ=CGQ.*sqrt(doppler_coeff);
%补零,使多普勒滤波器输出数据长度为Nifft,以备求ifft
Filtered_CGI=[f_CGI(1:Nfft/2) zeros(1,Nifft-Nfft) f_CGI(Nfft/2+1:Nfft)];
Filtered_CGQ=[f_CGQ(1:Nfft/2) zeros(1,Nifft-Nfft) f_CGQ(Nfft/2+1:Nfft)];
%求ifft,将多普勒滤波器输出频域信号转换到时域
hI=ifft(Filtered_CGI);hQ=(Filtered_CGQ);
%计算实部的平方加虚部的平方开平方,即呈瑞利分布的包络
rayEnvelope=sqrt(abs(hI).^2+abs(hQ).^2);
%计算包络的方均根值
rayRMS=sqrt(mean(rayEnvelope(1:N).*rayEnvelope(1:N)));
%图2-12最终输出的Clarke/Gan模型信道冲激响应
h=complex(real(hI(1:N)),-real(hQ(1:N)))/rayRMS;
%多普勒子程序,子程序名称:Doppler_spectrum.m
%对经典多普勒谱的仿真,参见式(2-25)
function y=Doppler_spectrum(fd,Nfft)
%输入参数:fd为最大多普勒频移,Nfft为频域样值点个数
%输出参数:y返回多普勒谱
df=2*fd/Nfft;%计算频率间隔
%计算f=0时多普勒谱
f(1)=0;y(1)=1.5/(pi*fd);
%计算其他频率多普勒谱。计算多普勒谱从第2个样值到Nfft/2个样值以及第Nfft/2+2个样值到第Nfft个样值
for i = 2:Nfft/2
    f(i)=(i-1)*df;%根据频率序号及频率间隔计算频率
    y([i Nfft-i+2])=1.5/(pi*fd*sqrt(1-(f(i)/fd)^2));
    %计算式(2-25),注意randn产生的高斯噪声方差为1
end
%计算多普勒谱的Nfft/2+1点样值。用四点样值构成多项式,之后求出多项式在Nfft/2+1点的样值。
nFitPoints=3;
kk=[Nfft/2-nFitPoints:Nfft/2];%四点样值序号为Nfft/2-3到Nfft/2
polyFreq=polyfit(f(kk),y(kk),3);%构成多项式
y((Nfft/2)+1)=polyval(polyFreq,f(Nfft/2)+df);%从多项式求Nfft/2点值

在这里插入图片描述
在我电脑上的matlab中遇到了这个警告,我将阶数修改为2虽然没有了警告,但图形和参考书上的还是对不上,目前还没找到那里的问题…

在这里插入图片描述
参考《MIMO-OFDM系统原理、应用及仿真》一书

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MATLAB中的维纳滤波(Wiener filtering)是一种基于统计模型的信号去噪方法,它假设信号是噪声和有用信号的线性叠加。维纳滤波通常用于估计信号中噪声的方差,并据此从观测数据中恢复出信号。在MATLAB中,`wiener2`函数可以用于二维数据(如图像)的维纳滤波。 维纳滤波估计噪声方差的基本步骤包括: 1. **模型建立**:假设信号\( x \)由有用信号\( s \)和随机噪声\( n \)组成,即\( x = s + n \),噪声通常假设为白噪声,其功率谱密度(PSD)是常数。 2. **噪声方差估计**:在没有先验知识的情况下,可以使用自相关函数(ACF)或互相关函数(CCF)来估计噪声的方差。在MATLAB中,可以通过计算数据的自相关矩阵来近似噪声的PSD。 3. **滤波器设计**:根据噪声方差估计,使用`wiener2`函数设计一个滤波器,该滤波器具有相同的噪声PSD,并优化其结构以最小化均方误差(MSE)。 4. **去噪处理**:将观测数据乘以维纳滤波器,得到去噪后的信号估计。 ```matlab % 假设x是观测数据,n是噪声,s是信号 % 噪声方差的估计 noiseVarianceEstimate = estimateNoisySignal(x); % 使用wiener2函数设计滤波器 filterKernel = wiener2(x, noiseVarianceEstimate); % 进行维纳滤波 denoisedSignal = imfilter(x, filterKernel, 'same'); % 对于图像处理 or denoisedSignal = filter(filterKernel, x); % 对于一维信号 % 查看结果 figure; subplot(2,1,1), plot(x), title('Original Signal'); subplot(2,1,2), plot(denoisedSignal), title('Denoised Signal'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值