matlab基音周期频率估计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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).

相关文档
最新文档