白噪声下真实正弦波的精确频率估计研究(Matlab代码实现)

2023-12-05

???????????????? 欢迎来到本博客 ❤️❤️????????

????博主优势: ???????????? 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️ 座右铭: 行百里者,半于九十。

???????????? 本文目录如下: ????????????

目录

????1 概述

????2 运行结果

????3 参考文献

????4 Matlab代码及数据


????1 概述

在白噪声下,真实正弦波的精确频率估计是一个重要的研究课题,因为白噪声会对信号的频率进行干扰,使得频率估计变得困难。下面是一些常用的方法来进行真实正弦波的精确频率估计研究:

1. 傅里叶变换:通过对信号进行傅里叶变换,可以得到信号的频谱信息,从而可以估计出频率。然而,在白噪声下,信号的频谱可能会被噪声掩盖,导致频率估计的不准确性。

2. 自相关函数:自相关函数可以用来评估信号中重复出现的模式,从而可以用来估计信号的频率。然而,在白噪声下,自相关函数的峰值可能会被噪声掩盖,导致频率估计的不准确性。

3. 峰值检测:通过寻找信号的峰值来进行频率估计。然而,在白噪声下,峰值可能会被噪声掩盖,导致频率估计的不准确性。

4. 希尔伯特变换:希尔伯特变换可以将信号从时域转换到频域,从而可以得到信号的频率信息。然而,在白噪声下,希尔伯特变换可能会受到噪声的影响,导致频率估计的不准确性。

综上所述,白噪声下真实正弦波的精确频率估计是一个复杂的问题,需要综合运用多种方法来进行研究和解决。在实际应用中,可以根据具体的情况选择合适的方法来进行频率估计。

???? 2 运行结果

可视化代码:

figure()
semilogy(SNRdB,CRLB/Fs*N,'--ks',SNRdB,RMSEBin(:,1),'-mo',SNRdB,RMSEBin(:,2),'-r*',...
SNRdB,RMSEBin(:,3),'-gd',SNRdB,RMSEBin(:,4),'-c.',SNRdB,RMSEBin(:,5),'-b^',...
SNRdB,RMSEBin(:,6),'-bv','LineWidth',1.2)
legend('CRLB','Proposed, second','Proposed, third','PSVD [5]','Djukanovic [9]','Ye [12],\it{T}=2','Ye [12],\it{T}=4')
xlabel('SNR(dB)')
ylabel('RMSE(in DFT bins)')
axis([-10,60,5*10^-5,20])
grid on
saveas(gcf,'..\results\Fig1.png')

%% Fig 2
Fs = 1; % Sampling frequency
N = [16 64 256 1024 4096]; % Number of samples
A = 1; % Half of Amplitude
SimTimes = 2000; % Number of simulation
SNRdB = 20; % SNR
RMSE = zeros(length(N),6); % RMSE
CRLB = sqrt(3*Fs^2./(pi^2*N.*(N.^2-1)*10.^(SNRdB/10))).'; % CRLB

for ii = 1:length(N)
ErrF = zeros(SimTimes,6); % Error of frequency estimation
for jj = 1:SimTimes
F = Fs/N(ii)*1.2; % Frequency
P = rand*2*pi; % Initial Phase
n = (0:N(ii)-1).';
s = 2*A*cos(2*pi*F/Fs*n+P); % real sinusoid
Ps = mean(s.^2); % Signal power
Pn = Ps/(10^(SNRdB/10)); % Noise Power
w = sqrt(Pn)*randn(N(ii),1);
s = w+s; % AWGN channel

EstF = ProposedInitial(s,Fs); % Initial estimate of proposed algorithm
ErrF(jj,1) = abs(EstF-F);
if ErrF(jj,1)>Fs/2
ErrF(jj,1) = Fs-ErrF(jj,1);
end

EstF = ProposedFine(s,Fs); % Fine estimate of proposed algorithm
ErrF(jj,2) = abs(EstF-F);
if ErrF(jj,2)>Fs/2
ErrF(jj,2) = Fs-ErrF(jj,2);
end

EstF = PSVD(s,Fs);
ErrF(jj,3) = abs(EstF-F);
if ErrF(jj,3)>Fs/2
ErrF(jj,3) = Fs-ErrF(jj,3);
end

EstF = Djukanovic(s,Fs);
ErrF(jj,4) = abs(EstF-F);
if ErrF(jj,4)>Fs/2
ErrF(jj,4) = Fs-ErrF(jj,4);
end

EstF = Ye(s,Fs,2); % Ye algorithm with T=2
ErrF(jj,5) = abs(EstF-F);
if ErrF(jj,5)>Fs/2
ErrF(jj,5) = Fs-ErrF(jj,5);
end

EstF = Ye(s,Fs,4); % Ye algorithm with T=4
ErrF(jj,6) = abs(EstF-F);
if ErrF(jj,6)>Fs/2
ErrF(jj,6) = Fs-ErrF(jj,6);
end


end
RMSE(ii,:) = sqrt(mean(ErrF.^2)); % RMSE in DFT bins
end
RMSEBin = RMSE/Fs.*repmat(N.',1,6); % RMSE in DFT bins
figure()
semilogy(log2(N),CRLB/Fs.*N.','--ks',log2(N),RMSEBin(:,1),'-mo',log2(N),RMSEBin(:,2),'-r*',...
log2(N),RMSEBin(:,3),'-gd',log2(N),RMSEBin(:,4),'-c.',log2(N),RMSEBin(:,5),'-b^',...
log2(N),RMSEBin(:,6),'-bv','LineWidth',1.2)
legend('CRLB','Proposed, second','Proposed, third','PSVD [5]','Djukanovic [9]','Ye [12],\it{T}=2','Ye [12],\it{T}=4')
xlabel('log_2\it{N}')
ylabel('RMSE(in DFT bins)')
grid on
saveas(gcf,'..\results\Fig2.png')

%% Fig 3
Fs = 1; % Sampling frequency
N = 1024; % Number of samples
A = 1; % Half of Amplitude
SimTimes = 1000; % Number of simulation
SNRdB = 20; % SNR
x = [0.55:0.25:2.05,3,6:N/2/9:N/2-6,N/2-3,N/2-2.05:0.25:N/2-0.55]; % Frequency in DFT bins
F = x*Fs/N; % Frequency in Hz
RMSE = zeros(length(F),6); % RMSE
CRLB = sqrt(3*Fs^2./(pi^2*N.*(N.^2-1)*10.^(SNRdB/10)))*ones(length(F),1); % CRLB

for ii = 1:length(F)
ErrF = zeros(SimTimes,6);
CRLBInst = zeros(SimTimes,1);
for jj = 1:SimTimes
P = rand*2*pi; % Initial Phase
n = (0:N-1).';
s = 2*A*cos(2*pi*F(ii)/Fs*n+P); % real sinusoid
Ps = mean(s.^2); % Signal power
Pn = Ps/(10^(SNRdB/10)); % Noise Power
w = sqrt(Pn)*randn(N,1);
s = w+s; % AWGN channel

EstF = ProposedInitial(s,Fs); % Initial estimate of proposed algorithm
ErrF(jj,1) = abs(EstF-F(ii));
if ErrF(jj,1)>Fs/2
ErrF(jj,1) = Fs-ErrF(jj,1);
end

EstF = ProposedFine(s,Fs); % Fine estimate of proposed algorithm
ErrF(jj,2) = abs(EstF-F(ii));
if ErrF(jj,2)>Fs/2
ErrF(jj,2) = Fs-ErrF(jj,2);
end

EstF = PSVD(s,Fs);
ErrF(jj,3) = abs(EstF-F(ii));
if ErrF(jj,3)>Fs/2
ErrF(jj,3) = Fs-ErrF(jj,3);
end

EstF = Djukanovic(s,Fs);
ErrF(jj,4) = abs(EstF-F(ii));
if ErrF(jj,4)>Fs/2
ErrF(jj,4) = Fs-ErrF(jj,4);
end

EstF = Ye(s,Fs,2); % Ye algorithm with T=2
ErrF(jj,5) = abs(EstF-F(ii));
if ErrF(jj,5)>Fs/2
ErrF(jj,5) = Fs-ErrF(jj,5);
end

EstF = Ye(s,Fs,4); % Ye algorithm with T=4
ErrF(jj,6) = abs(EstF-F(ii));
if ErrF(jj,6)>Fs/2
ErrF(jj,6) = Fs-ErrF(jj,6);
end

end
RMSE(ii,:) = sqrt(mean(ErrF.^2,1));
end
RMSEBin = RMSE/Fs*N; % RMSE in DFT bins
figure()
semilogy(x,CRLB/Fs*N,'--ks',x,RMSEBin(:,1),'-mo',x,RMSEBin(:,2),'-r*',...
x,RMSEBin(:,3),'-gd',x,RMSEBin(:,4),'-c.',x,RMSEBin(:,5),'-b^',...
x,RMSEBin(:,6),'-bv','LineWidth',1.2)
legend('CRLB','Proposed, second','Proposed, third','PSVD [5]','Djukanovic [9]','Ye [12],\it{T}=2','Ye [12],\it{T}=4')
xlabel('\it{Nf/fs}')
ylabel('RMSE(Hz)')
axis([0,512,1*10^-3,1])
grid on
saveas(gcf,'..\results\Fig3.png')

????3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1] Ying X , Shu-Xiong L , Jun-Xun Y .Frequency estimation of single complex sinusoid in white Gaussian noise[J].Journal of China Institute of Communications, 2002.DOI:10.1002/mop.10502.

[2] Liu S , Xu W , Wang Z .An Accurate Frequency Estimator of Single Sinusoid in Gaussian Colored Noise.[C]//International Conference on Innovative Computing.IEEE, 2006.DOI:10.1109/ICICIC.2006.227.

[4]丁志中.白噪声背景下正弦信号频率和功率估计的有效算法[J].合肥工业大学学报:自然科学版, 1995, 18(4):6.DOI:CNKI:SUN:HEFE.0.1995-04-002.

[5]吴珊珊胡国兵丁宁汤滟.正弦波频率估计结果的可靠性评估算法研究[J].现代雷达, 2015, 37(3):31-35.

???? 4 Matlab代码及数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

白噪声下真实正弦波的精确频率估计研究(Matlab代码实现) 的相关文章

  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • 通过 h5py 将 matlab v7.3 文件读入 python numpy 数组列表

    我知道以前已经有人问过这个问题 但在我看来 仍然没有答案可以解释正在发生的事情 并且不适用于我的情况 我有一个 matlab v7 3 文件 其结构如下 gt rank lt 1x454 cell gt gt each element is
  • Matlab 中的多行匿名函数? [复制]

    这个问题在这里已经有答案了 是否可以在 Matlab 中创建多行匿名函数 没有合适的例子在文档中 http www mathworks com help matlab matlab prog anonymous functions html
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • 如何使用matlab生成不同频率的正弦波?

    对于我的项目 我需要使用 matlab 生成一个正弦波 它有 100 000 个样本 并且频率在每 10 000 个样本后随机变化 采样率和频率可以根据方便而定 matlab中有没有函数可以生成这个 好的另一个例子 生成 5 个随机频率 r
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • MATLAB - 如何将子图一起缩放?

    我在一张图中有多个子图 每个图的 X 轴是相同的变量 时间 每个图上的 Y 轴都不同 无论是它所代表的内容还是数据的大小 我想要一种同时放大所有图的时间尺度的方法 理想情况下 可以在其中一张图上使用矩形缩放工具 并让其他图相应地更改其 X
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • Matlab 字段名索引[重复]

    这个问题在这里已经有答案了 所以我有一个包含多个表的元胞数组 我试图访问表的第一个列名称 c table1 table2 table3 以下两行都给了我错误 fieldnames c 1 1 fieldnames c 1 1 Error i
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • 在 Matlab 中将 datenum 转换为 datetime 的最快方法

    我在 Matlab 中将 datenum 转换为 datetime 时遇到问题 Given dnum floor now floor now 1 我尝试了以下方法 datenum dnum 但这没有用 我发现有效的方法是 datetime
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat

随机推荐