%rife算法的Matlab实现,作者Roy,时间:2022-04-24
%本文将以正弦信号为例,用MATLAB进行数字信号频谱分析
%主要使用了fft函数与fftshift函数,并对结果作出分析。
%产生余弦信号以作频谱分析:
%余弦信号y=A*sin(2*pi*f*t);
clc,clear,close all;
f=100; %信号频率为
A=2; %设置正弦波幅值
N=1024; %采样点个数
n=0:N-1; %采样序列
fs=2000; %采样频率为fs=2K
ts=1/fs; %采样间隔
T=N*ts; %采样时间
x=A*sin(2*pi*f*n*ts); %正弦波信号
subplot(4,1,1);plot(n*ts,x);
%添加高斯噪声
SNR=-5; %测试发现信噪比等于-50时,无法估计
xn=awgn(x,SNR); %SNR参数,可参考awgn函数
subplot(4,1,2);plot(n*ts,xn);
%FFT变换在频谱上观察信号频率
m=-fs/2:(fs/N):(fs/2-(fs/N)); %其中fs/N为采样分辨率
y=fft(xn);
y=fftshift(y);
subplot(4,1,3);plot(m,abs(y));
%%%使用rife算法进行频率估计
yw=abs(fft(xn)); %傅里叶变换
subplot(4,1,4);stem(n,yw);
[valueMax,posMax] = max(yw(1:N)); %得到谱线最大值与坐标
if( yw(posMax+1) >= yw(posMax-1)) %判断r的值
r=1;
else
r=-1;
end
delta = yw(posMax+r)/(valueMax+yw(posMax+r));
fc = 1/T*(posMax-1+r*delta); %输出估计的频率值fc,一开始没有减1,导致误差比较大,可以将1/T*(posMax-1)、1/T*(posMax)分别输出与图像对比
result = strcat('信号估计出的频率为',num2str(fc),'Hz;','实际频率是:',num2str(f),'Hz;');
disp(result);
Rife算法的Matlab实现
版权申诉
5星 · 超过95%的资源 55 浏览量
2022-04-24
21:54:11
上传
评论 7
收藏 61KB RAR 举报
剑藏锋
- 粉丝: 9
- 资源: 28
- 1
- 2
- 3
- 4
- 5
- 6
前往页