首页 > 编程知识 正文

qt开源频谱图,python频谱图

时间:2023-05-05 04:36:43 阅读:120996 作者:3394

FFT是离散傅立叶变换的快速算法,可以变换一个信号

到频域。 虽然在时域中有些信号很难识别任何特征,例如

转换到频域后,特征变得容易理解。 这就是很多信号

分析采用FFT变换的原因。 此外,FFT表示一个信号的频谱

提取。 这在光谱分析方面也很常用。

虽然很多人知道FFT是什么,能用来做什么,怎么去

但是,FFT后的结果是什么意思,不知道怎么决定使用

几点做FFT?

现在,沉稳的羽毛会根据实际经验说出FFT结果的具体物理意义。

一个模拟信号经过ADC采样变为数字信号。 抽样调查

定理表明,采样频率大于信号频率的两倍。 这些我

别在这里唠叨。

采样得到的数字信号可以进行FFT变换。 n个采样点,

经过FFT,可以得到n个点的FFT结果。 为了使FFT容易进行

运算通常采用n为2的整数次幂。

设采样频率为Fs、信号频率f、采样点数为n。 那么FFT

其结果,可以得到n点的复数。 每一点都对应一个频率

重点。 这一点的固有值是其频率值下的振幅特性。 具体地说是原始和

信号的宽度有什么关系? 设原始信号的峰值为a,则FFT

的结果中各点(第一点的直流分量除外)的模值为a

的二分之一倍。 第一个点是直流分量,其模式值是直流分量

的n倍。 各点的相位是该频率下信号的相位。

第一点表示直流分量,即0Hz,表示最后一点n的下一点

点(实际上这一点不存在。 这里是假设的第N 1点,也是

可以认为第一个点分成一半,另一半最后移动)

采样频率Fs,其中间在N-1个点被平均n等分,各点频率

依次增加。 例如,某点n表示的频率是Fn=(n-1 ) *Fs/N。

由上式可知,Fn能够识别的频率是Fs/N,如果

如果采样频率Fs为1024Hz,采样点数为1024点,则可以识别到1Hz。

1024Hz的采样率采样1024点,正好采样1秒,即1秒

如果对的时间信号进行FFT,则结果可以分析到1Hz,如果采样2秒

之间的信号进行FFT后,结果可以分析到0.5Hz。 要提高频率

分辨率需要增加采样点数,也就是采样时间。 频率分辨率和

采样时间是倒数的关系。

如果用复数a bi表示FFT之后的某一点n,则该复数的类型为

An=根编号a*a b*b,相位为pn=Atan2(b,a )。 根据以上结果,

可以计算与n点1且n=N/2 )对应的信号的公式如下。

an/(n/2 ) cos )2*pi*fn*tpn (即2*an/n*cos )2*pi*fn*tpn )。

对于n=1点的信号为直流分量,宽度为A1/N。

由于FFT结果的对称性,通常只使用前半部分的结果。

即采样频率一半以下的结果。

那么,说了半天,看着公式也晕了过去,下面沉稳的羽毛变成了实际的

用信号说明。

含有2V的直流成分,频率为50Hz,

相位为-30度、振幅为3V交流信号和一个频率为75Hz,

相位为90度、宽度为1.5V的交流信号。 公式如下。

s=23*cos(2*pi*50*t-pi*30/180 ) 1.5 * cos (2* pi * 75 * TPI * 90/180 ) )

式中的cos参数为弧度,因此-30度和90度必须分别换算为弧度。

以256Hz的采样率对该信号进行采样,共计采样256点。

根据以上分析,fn=(n-1 ) *Fs/N每两个

点之间的间隔为1Hz,第n个点的频率为n-1。 我们的信号

有0Hz、50Hz、75Hz三个频率,分别是第一点、第五十一点、

第76点出现峰值,其他点应该接近0。 实际情况怎么样?

看看FFT结果的震级。

图1 FFT结果

从图中可以看出,在第1点、第51点、第76点附近

比较大的值。 把这三点附近的数据分别拿来仔细看看。

1点: 512 0i

2点:-2.6195E-14 - 1.4162E-13i

3点:-2.8586E-14 - 1.1898E-13i

50时:-6.2076E-13 - 2.1713E-12i

51时: 332.55 - 192i

52时:-1.6707E-12 - 1.5241E-12i

75时:-2.2199E-13 -1.0076E-12i

76时: 3.4315E-12 192i

77时:-3.0263E-14 7

5609E-13i

很明显,1点、51点、76点的值都比较大,它附近的点值

都很小,可以认为是0,即在那些频率点上的信号幅度为0。

接着,我们来计算各点的幅度值。分别计算这三个点的模值,

结果如下:

1点: 512

51点:384

76点:192

按照公式,可以计算出直流分量为:512/N=512/256=2;

50Hz信号的幅度为:384/(N/2)=384/(256/2)=3;75Hz信号的

幅度为192/(N/2)=192/(256/2)=1.5。可见,从频谱分析出来

的幅度是正确的。

然后再来计算相位信息。直流信号没有相位可言,不用管

它。先计算50Hz信号的相位,atan2(-192, 332.55)=-0.5236,

结果是弧度,换算为角度就是180*(-0.5236)/pi=-30.0001。再

计算75Hz信号的相位,atan2(192, 3.4315E-12)=1.5708弧度,

换算成角度就是180*1.5708/pi=90.0002。可见,相位也是对的。

根据FFT结果以及上面的分析计算,我们就可以写出信号的表达

式了,它就是我们开始提供的信号。

总结:假设采样频率为Fs,采样点数为N,做FFT之后,某

一点n(n从1开始)表示的频率为:Fn=(n-1)*Fs/N;该点的模值

除以N/2就是对应该频率下的信号的幅度(对于直流信号是除以

N);该点的相位即是对应该频率下的信号的相位。相位的计算

可用函数atan2(b,a)计算。atan2(b,a)是求坐标为(a,b)点的角

度值,范围从-pi到pi。要精确到xHz,则需要采样长度为1/x秒

的信号,并做FFT。要提高频率分辨率,就需要增加采样点数,

这在一些实际的应用中是不现实的,需要在较短的时间内完成

分析。解决这个问题的方法有频率细分法,比较简单的方法是

采样比较短时间的信号,然后在后面补充一定数量的0,使其长度

达到需要的点数,再做FFT,这在一定程度上能够提高频率分辨力。

具体的频率细分法可参考相关文献。

[附录:本测试数据使用的matlab程序]

close all; %先关闭所有图片

Adc=2; %直流分量幅度

A1=3; %频率F1信号的幅度

A2=1.5; %频率F2信号的幅度

F1=50; %信号1频率(Hz)

F2=75; %信号2频率(Hz)

Fs=256; %采样频率(Hz)

P1=-30; %信号1相位(度)

P2=90; %信号相位(度)

N=256; %采样点数

t=[0:1/Fs:N/Fs]; %采样时刻

%信号

S=Adc+A1*cos(2*pi*F1*t+pi*P1/180)+A2*cos(2*pi*F2*t+pi*P2/180);

%显示原始信号

plot(S);

title('原始信号');

figure;

Y = fft(S,N); %做FFT变换

Ayy = (abs(Y)); %取模

plot(Ayy(1:N)); %显示原始的FFT模值结果

title('FFT 模值');

figure;

Ayy=Ayy/(N/2); %换算成实际的幅度

Ayy(1)=Ayy(1)/2;

F=([1:N]-1)*Fs/N; %换算成实际的频率值

plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果

title('幅度-频率曲线图');

figure;

Pyy=[1:N/2];

for i="1:N/2"

Pyy(i)=phase(Y(i)); %计算相位

Pyy(i)=Pyy(i)*180/pi; %换算为角度

end;

plot(F(1:N/2),Pyy(1:N/2)); %显示相位图

title('相位-频率曲线图');

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。