matlab基音周期频率估计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
专业班级 组别
成员
实验内容:利用至少两种频率估计方法编程求给定信号的频率 1 设计思路
方案一:采用谱峰估计法
将信号进行傅里叶变换,从频谱中找到幅度最大的谱线,对应频点与频率分辨率乘积即为信号频率。
方案二:采用导数法
利用傅里叶变换性质,将原信号进行时域求导,再利用离散Parseval 定理,求出原信号的频率。
具体推导公式如下:
时域信号()j t x t e Ω=,求导得()()()()n n x t j x t =Ω 两边同时平方积分,得 ()2222|()||()()||()|n n n x t dt j x t dt x t dt ∞
∞∞-∞-∞-∞=Ω=Ω⎰⎰⎰
即
Ω=
运用离散Parseval 定理,得
2N π
ω= 其中,ω为0~2π的一个频点,采样频率为Fs ,由此计算出频率2f Fs ωπ
=⨯
2 程序代码
① 谱峰估计法
function f=pufeng
load signal; %信号自动存于变量S
N=128;
Fs=4000; %信号采样频率
f=zeros(1,7);
y=abs(fft(S,N));
[m,n]=max(y);
f(1)=(n-1)*Fs/N; %无噪声时求出的频率
SNR=[20 15 10 5 0 -5];%信噪比
for i=1:6
S=awgn(S,SNR(i));
y=abs(fft(S,N));
[m,n]=max(y);
f(i+1)=(n-1)*Fs/N;
end
plot(f);hold;
plot(f,'.');
axis([0 8 340 355]);
xlabel('无噪声--> 20dB --> 15dB --> 10dB --> 5dB --> 0dB --> -5dB');
legend('谱峰估计法');
②导数法
function f=daoshu2
Fs=4000;
N=128;
n=1; %求导次数n
delta=6;
SNR=[20 15 10 5 0 -5]; %信噪比
load signal;
signal=zeros(7,length(S));
signal(1,:)=S;
for i=1:6
signal(i+1,:)=awgn(S,SNR(i)); %加性高斯白噪声end
for j=1:7
F=abs(fft(signal(j,:),N));
[Fm,k0]=max(F);
En1=0;En2=0;
for k=k0-delta:k0+delta;
En1=En1+(k-1)^(2*n)*F(k)^2;
En2=En2+F(k)^2; %主瓣能量
end
f(j)=Fs/N*(En1/En2)^(1/(2*n));
end
plot(f,'r');hold;
plot(f,'.r');axis([0 8 340 355]);
xlabel('无噪声--> 20dB --> 15dB --> 10dB --> 5dB --> 0dB --> -5dB');
legend('导数法');
3 程序使用说明
将谱峰估计法代码保存为pufeng.m文件,将导数法代码保存于daoshu2.m 文件,直接调用程序pufeng或daoshu2,查看运行结果。
为了能将两个程序的结果同时显示,便于比较,可以使用一下代码:
f1=pufeng;
f2=daoshu2;
hold on;
plot(f1,'.');
plot(f1);
plot(f2,'.r');
plot(f2,'r');
axis([0 8 340 355]);
xlabel('无噪声--> 20dB --> 15dB --> 10dB --> 5dB --> 0dB --> -5dB');
ylabel('f (Hz)');
legend('导数法','谱峰估计法');
4 运行结果与分析
已知给定待测信号的频率为350Hz,从上图可以看出,在相同N值的前提下(此处N=128),导数法估计出的信号频率比较准确。
另外,通过对信号加白噪声后进行频率估计,可以看出,谱峰估计法不受信噪比影响,所以在信噪比极低的情况下,谱峰估计法可以估计出相对准确的频率值。
5 设计中遇到的问题与心得
这次的实验说简单不简单,说困难不困难,经过了上次实验,我们对MATLAB 这个软件重新熟悉了,经过对老师的那两种方法的分析,具体思路的把握,我们很快就可以编出程序。
遇到的问题也不是很多,主要就是一些细节方面的东西没注意。
比如说,MATLAB中的数组下标是从1开始,所以第k个点对应的间隔数应为k-1,之前写程序的时候没有注意到这点,结果导致估计出的频率偏差很大。
另外,我们还试过Pisarenko算法的matlab程序,估计出来的频率比较精准。
这次的实验我们对MATLAB这软件更熟悉了,也运用到一些新的函数,同时我们还学习到了两种频率估计方法:谱峰估计法和导数法。
参考文献
[1] 彭鸿铭. “对混有复白噪声的正弦信号的频率估计” 江汉大学学报, 2002, 19(3).。