整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Matlab实现FFT,画出正确的频谱图

在通信、信号处理和更广泛的电气工程领域,信号是任意的、随时间变化的或者随空间变化的量。

信号可分为连续时间信号和离散时间信号:

离散信号或离散时间信号是一种时间序列,可能是从连续时间信号中采样出来。

图1 连续时间信号与离散时间信号

周期信号与非周期信号。

一个信号周期为T,那么定义其基频f0=1/T,谐频kf0,k=1,2,3...

任何周期信号(并不是严格意义上的任何)都可以由不同谐振频率kf0信号,相叠加而成,这就是傅里叶级数展开。

图2 周期信号与非周期信号

一个信号有一个或多个频率,可以从两个不同的角度来观察:时域和频域。

图3 信号的时域与频域

本文就是介绍如何进行频域的分析,当然使用计算机啦。

通过计算机中的MATLAB软件自带的FFT函数分析频谱。

文中举得例子看似简单,但同学们如果真正要理解,其实是需要一定信号处理知识的积累的。

四种傅里叶变换

再来看一下经典的图4,我认为学习通信或者数字信号处理,必须要搞明白各种不同的"傅里叶"。

图4 四种经典的傅里叶变换

图4(a)是最为熟悉的傅里叶变换,针对非周期、连续的信号,其变换后的频谱为连续的、非周期的。公式为

图4(b)是傅里叶级数,针对周期、离散的信号,变换后的信号是离散的、非周期的频谱。

图4(c)是离散时间傅里叶变换,针对离散、非周期的信号,变换后的信号是周期的、连续的频谱。

图4(d)是离散傅里叶级数,针对离散的、周期的信号,变换后的频谱是离散的、周期的

图5 四种傅里叶变换总结

四种傅里叶变换的可以如图5总结。

我们发现:

  • 时域的连续,总是对应着频域的非周期;
  • 时域的离散,总是对应着频域的周期;

反之亦然。

其中FT、FS、DTFT至少有一个域不是离散的信号,所以不适合计算机去处理。

DFS满足时域和频域都是离散的要求,但其时域为无限长的周期序列。

图6 DFS到DFT

所以我们只要取其中N个点,定义为主值序列,然后用来求取傅里叶变换。

这样的傅里叶变换就是DFT,离散傅里叶变换,其公式为:

DFT的运算量大,不利于大数据量的计算。

图7 DFT到FFT

此时,就出现了快速傅里叶变换,即FFT。

FFT是DFT的快速算法,可以节省大量的计算时间,其本质仍然是DFT。

DFT的时域与频域的联系

仔细观察图4的DFS系列,主值序列有N个点。

在时域中,如果离散信号是以T1为周期向两边延拓,那么频域的谱间隔为f1=1/T1;

同样的,如果在频域是以fs为周期向两边延拓,那么时域的信号间隔为Ts=1/fs;

所以,我们可以得出fs/f1=N;

换个角度看。

X[k]算出来的是一个序列值,那么这个序列值与频率有何关系呢?

我们知道DFT的频谱间隔为f1,那么,那么频率轴就是k倍的f1,即是kf1,其中f1=fs/N;

举个例子

我们定义个信号,它包含幅度值为0.7,频率为50Hz的正弦和幅度值为1,频率为120Hz的正弦.

采样频率为1kHz;

信号序列长度N=1500;

程序如下:

clf;
Fs = 1000; % 采样频率1kHz 
T = 1/Fs; % 采样周期1ms 
L = 1500; % 信号长度
t = (0:L-1)*T; % 时间序列
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
subplot(211);
plot(1000*t,S);
title('包含幅值为0.7的50Hz正弦量和幅值为1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
subplot(212);
plot(1000*t(1:50),S(1:50));
title('取前50ms的数据,包含幅值为0.7的50Hz正弦量和幅值为1的120Hz正弦量')
xlabel('t (毫秒)')
ylabel('X(t)')
Y = fft(S);
mag = abs(Y); %求得FFT变换后的振幅
f=(0:L-1)*Fs/L; %频率序列
figure
plot(f,mag); %绘出随频率变化的振幅
title('信号的FFT')
xlabel('频率f (Hz)')
ylabel('|幅度mag|')

图8 原始信号

通过图8,我们可以看出原始信号的波形。图8的上方为1500毫秒的信号,图8的下方为取前50ms的信号。当从上图中,很难看出信号是由50Hz和120Hz的频率组成。

图9 信号的频谱

图9的横坐标为频率单位Hz,总长为1000Hz(为什么呢?读者可以思考下)

我们发现在50Hz和120Hz处,出现明显的峰值。

总结

本文中采样频率Fs=1000Hz,整个频谱是关于500Hz对称的。其中500Hz就是Nyquist频率Fs/2。

所以FFT的频谱图是以Nyquist频率为对称轴的。

并且可以明显识别出信号中含有两种频率成分:50Hz和120Hz。

因此用FFT对信号做谱分析,只需考察0~Nyquist频率范围内的幅频特性。

本文只是简单的入门,如果各位同学想用好FFT这个频谱分析工具,建议动手去实验,可以发现很多有趣的性质。

看到这里帮班长点个赞吧,欢迎在评论去留言讨论!

参考文献:

[1]FFT-Matlab初步实现.https://www.cnblogs.com/WHaoL/p/6595132.html

[2]matlab 中fft的用法.https://www.cnblogs.com/alexanderkun/p/4723577.html

[3]fft.https://ww2.mathworks.cn/help/matlab/ref/fft.html

调用oneMKL相应 API函数,产生2048 * 2048 个随机单精度0∽1实数,根据产生的随机数据作为输入,实现两维Real to complex FFT。 利用上面生成的随机数作为数据输入,计算输入数据的FFT,两维Real to complex FFT的计算分为几个部分,首先是使用大家熟知的fftw3方法,主要是使用fftw3函数进行二维傅里叶变换,以及调用 oneMKL API 计算两维Real to complex FFT,对处理时间进行对比。


eautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

案例(解析一个列表的标题)

  try:
        r = requests.get("https://www.runoob.com/w3cnote", params={})
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        soup = BeautifulSoup(r.text, "html.parser")
        find_all = soup.find_all(attrs={"class": "archive-list-item"})
        for item in find_all[:find_all.__len__()-1]:
            print(item.div.h2.a.string)
    except:
        print("爬取失败")

效果:

7.6 Verilog DDS 设计

8.1 Verilog 数值转换

7.5 Verilog FFT 设计

7.4 Verilog CIC 滤波器设计

7.3 Verilog 串行 FIR 滤波器设计

7.2 Verilog 并行 FIR 滤波器设计

7.1 Verilog 除法器设计

6.7 Verilog 流水线

6.6 Verilog 仿真激励

6.5 Verilog 避免 Latch