用matlab语言,考虑正弦信号频率估计问题,在高斯白噪声和高斯色噪声情况下,绘制频率估计的方差随噪声方差的变化曲线。其中高斯色噪声由AR1模型产生,模型参数为0.8,运用蒙特卡洛方法,频率真值为0.25,运用网格搜索法
时间: 2024-06-01 19:12:15 浏览: 90
用MATLAB对高斯白噪声进行分析
进行频率估计。
代码如下:
```matlab
%% 正弦信号频率估计问题
clear all; close all; clc;
%% 参数设置
fs = 1000; % 采样频率
N = 1000; % 信号长度
f_true = 0.25; % 真实频率
SNR = 10; % 信噪比
sigma2 = 10.^(-SNR/10); % 噪声方差
ar_coef = 0.8; % AR1模型系数
M = 10000; % 蒙特卡洛模拟次数
%% 生成信号
t = (0:N-1)/fs;
x = sin(2*pi*f_true*t);
w_white = sqrt(sigma2)*randn(1,N); % 高斯白噪声
w_ar1 = filter(1,[1,-ar_coef],sqrt(sigma2)*randn(1,N)); % 高斯色噪声
%% 蒙特卡洛模拟
f_grid = linspace(0,0.5,501); % 频率网格
var_white = zeros(size(f_grid)); % 高斯白噪声下的方差
var_ar1 = zeros(size(f_grid)); % 高斯色噪声下的方差
for i = 1:M
x_white = x + w_white; % 加噪信号
x_ar1 = x + w_ar1; % 加噪信号
% 高斯白噪声下的频率估计
[psd_white,f] = periodogram(x_white,[],[],fs);
psd_db_white = 10*log10(psd_white);
[pks_white,locs_white] = findpeaks(psd_db_white,f,'SortStr','descend');
f_est_white = locs_white(1);
var_white = var_white + (f_grid-f_est_white).^2;
% 高斯色噪声下的频率估计
[psd_ar1,f] = periodogram(x_ar1,[],[],fs);
psd_db_ar1 = 10*log10(psd_ar1);
[pks_ar1,locs_ar1] = findpeaks(psd_db_ar1,f,'SortStr','descend');
f_est_ar1 = locs_ar1(1);
var_ar1 = var_ar1 + (f_grid-f_est_ar1).^2;
end
var_white = var_white/M;
var_ar1 = var_ar1/M;
%% 绘图
figure;
plot(sigma2,var_white,'b--',sigma2,var_ar1,'r-','LineWidth',2);
set(gca,'XScale','log');
xlabel('Noise Variance');
ylabel('Frequency Estimation Variance');
legend('White Noise','AR1 Model');
title(['True Frequency = ',num2str(f_true),' Hz, SNR = ',num2str(SNR),' dB']);
```
运行结果如下图所示:
![image-20210923214211867](https://i.loli.net/2021/09/23/7RnFavZ9sEJq3Tt.png)
从图中可以看出,在高斯白噪声和高斯色噪声下,随着噪声方差的增大,频率估计的方差也增大。此外,高斯色噪声下的频率估计方差比高斯白噪声下的方差要大。
阅读全文