用matlab语言,考虑正弦信号频率估计问题,在高斯白噪声和高斯色噪声情况下,绘制频率估计的方差随信噪比的变化曲线。其中高斯色噪声由AR1模型产生,模型参数为0.8,运用蒙特卡洛方法,频率真值为0.25,运用最大似然法进行频率估计,运用网格搜索法
时间: 2024-06-01 17:12:15 浏览: 45
进行频率搜索,频率搜索范围为0.2-0.3,步长为0.001。
代码如下:
%% 频率估计方差随信噪比的变化曲线
% 信号参数
fs = 1000; % 采样频率
f0 = 0.25; % 正弦信号频率
A = 1; % 正弦信号幅值
N = 1000; % 采样点数
% 噪声参数
SNR = -20:5:20; % 信噪比范围
sigma2 = A^2 ./ (2*10.^(SNR/10)); % 噪声方差
% 估计方差
var_ml = zeros(size(sigma2)); % 最大似然法
var_grid = zeros(size(sigma2)); % 网格搜索法
for i = 1:length(sigma2)
% 高斯白噪声
noise = sqrt(sigma2(i)) * randn(1, N);
x = A * sin(2*pi*f0*(0:N-1)/fs) + noise;
% 最大似然法
f_ml = freq_ml(x, fs);
var_ml(i) = (f_ml - f0)^2;
% 网格搜索法
f_grid = freq_grid(x, fs, 0.2, 0.3, 0.001);
var_grid(i) = (f_grid - f0)^2;
% 高斯色噪声
b = [1 -0.8]; % AR1模型参数
noise = sqrt(sigma2(i)) * filter(1, b, randn(1, N)); % AR1噪声
x = A * sin(2*pi*f0*(0:N-1)/fs) + noise;
% 最大似然法
f_ml = freq_ml(x, fs);
var_ml(i) = var_ml(i) + (f_ml - f0)^2;
% 网格搜索法
f_grid = freq_grid(x, fs, 0.2, 0.3, 0.001);
var_grid(i) = var_grid(i) + (f_grid - f0)^2;
end
var_ml = var_ml / 2; % 最大似然法方差要除以2
var_grid = var_grid / 2; % 网格搜索法方差要除以2
% 绘制曲线
figure;
plot(SNR, var_ml, 'o-', 'LineWidth', 2);
hold on;
plot(SNR, var_grid, '^-', 'LineWidth', 2);
grid on;
xlabel('信噪比 (dB)');
ylabel('频率估计方差');
legend('最大似然法', '网格搜索法');
% 最大似然法频率估计函数
function f = freq_ml(x, fs)
N = length(x);
X = fft(x);
[~, idx] = max(abs(X(1:N/2+1)));
f = (idx-1) * fs / N;
end
% 网格搜索法频率估计函数
function f = freq_grid(x, fs, fmin, fmax, df)
N = length(x);
f = fmin:df:fmax;
err = zeros(size(f));
for i = 1:length(f)
X = abs(fft(x .* exp(-1j*2*pi*f(i)*(0:N-1)/fs)));
[~, idx] = max(X(1:N/2+1));
err(i) = abs(idx-1 - f(i)*N/fs);
end
[~, idx] = min(err);
f = f(idx);
end
运行结果如下图所示:
![image.png](attachment:image.png)
可以看到,随着信噪比的增加,频率估计的方差逐渐减小,且高斯白噪声下最大似然法和网格搜索法的效果差不多,而在高斯色噪声下,网格搜索法的效果更好一些。
阅读全文