频域如何使用Matlab曲线fft,变换的提出函数

Matlab 可以说是一个非常实用且功能齐全的工具,在通信、自动控制、金融等领域有着广泛的应用。

本文引用地址:

本文讨论了一种使用Matlab对信号进行频域分析的方法。

说到频域,难免要提到傅里叶变换,它提供了一种将信号从时域变换到频域的方法。之所以对信号进行频域分析,是因为很多在时域上不明显的信号,在频域上都能很好的展现出来,更容易分析和处理。

快速傅里叶变换

Matlab提供的傅里叶变换函数为FFT,中文名称为Fast Fourier Transform。快速傅里叶变换的提议很棒,大大提高了处理器处理数字信号的能力,也让我们的生活朝着数字化迈出了一大步。

我们来谈谈如何使用这个功能。

fft使用起来很简单,但是一般的信号有x和y两个向量,而fft只处理y向量,所以如果想让频域分析有意义,就需要对x向量进行处理自己

一个简单的例子

让我们从一个简单的正弦信号开始,定义为:

我们现在通过下面的代码在 Matlab 中绘制这个正弦曲线

fo = 4; %正弦波频率

Fs = 100; %采样率

Ts = 1/Fs; %采样时间间隔

t = 0:Ts:1-Ts; %采样周期

n = 长度(t); % 样本数

y = 2*sin(2*pi*fo*t); %正弦曲线

%在时域中绘制余弦曲线

sinePlot = 图;

绘图(t,y)

xlabel(‘时间(秒)’)

ylabel(‘y(t)’)

title(‘示例正弦波’)

网格

这是我们得到的:

当我们对这条曲线进行 fft 时,我们期望在频域中获得以下频谱(基于傅立叶变换理论,我们期望在 -4Hz 处看到幅度为 1 的峰值,在 +4Hz 处看到另一个幅度)

使用 FFT 命令

我们知道目标是什么,所以现在使用 Matlab 内置的 FFT 函数来重新生成频谱

%使用 MATLAB fft 命令绘制频谱

matlabFFT = 图; %创建一个新人物

YfreqDomain = fft(y); %取我们正弦波的 fftmatlab信号时频分析,y(t)

stem(abs(YfreqDomain)); %使用abs命令获取幅度

%相似,我们将使用角度命令来获取相位图!

%我们将在另一篇文章中讨论阶段!

xlabel(‘样本编号’)

ylabel(‘幅度’)

title(‘使用 Matlab fft 命令’)

网格

轴([0,100,0,120])

效果如下:

但请注意,这并不是我们真正想要的,缺少一些信息

x轴应该给我们频率信息,但是你能读出频率吗?

幅度为 100

没有使频谱居中

为 FFT 定义一个函数以获得双边谱

以下代码可以简化获取双边频谱的过程,复制并保存到你的.m文件中

函数 [X,freq]=centeredFFT(x,Fs)

%这是一个自定义函数,有助于绘制两侧光谱

%x 是要转换的信号

%Fs 是采样率

N=长度(x);

%这部分代码生成那个频率轴

如果 mod(N,2)==0

k=-N/2:N/2-1; %N 偶数

其他

k=-(N-1)/2:(N-1)/2;%N奇数

结束

T=N/Fs;

频率=k/T; %频率轴

%取信号的fft,并相应调整幅度

X=fft(x)/N; % 标准化数据

X=fftshift(X); %移动 fft 数据使其居中

此函数输出正确的频域范围和变换后的信号。它需要输入要转换的信号和采样率。

然后用前面的正弦信号作为一个简单的例子,注意你的例子.m文件应该和centeredFFT.m文件在同一个目录

[YfreqDomain,frequencyRange] = centeredFFT(y,Fs);

centeredFFT = 图;

%记得取 YfreqDomain 的 abs 来获取幅度!

stem(frequencyRange,abs(YfreqDomain));

xlabel(‘频率 (Hz)’)

ylabel(‘幅度’)

title(‘使用centeredFFT函数’)

网格

轴([-6,6,0,1.5])

效果如下:

这张图满足了我们的需求,我们在+4和-4得到了峰值,幅度是1.

为 FFT 定义一个函数以获得正确的频谱

从上图可以看出matlab信号时频分析,FFT变换得到的频谱是左右对称的,所以我们只需要一侧就可以得到信号的全部信息,一般我们保持正频一侧。

下面的函数对上面的自定义函数做了一些修改,这样可以帮助我们只画出信号的正频侧

函数 [X,freq]=positiveFFT(x,Fs)

N=长度(x); %获取点数

k=0:N-1; %创建一个从0到N-1的向量

T=N/Fs; %获取频率区间

频率=k/T; %创建频率范围

X=fft(x)/N; % 标准化数据

%只想要 FFT 的前半部分,因为它是多余的

cutOff = ceil(N/2);

%只取频谱的前半部分

X = X(1:cutOff);

频率 = 频率(1:cutOff);

和之前一样,以正弦信号为例,下面是示例代码

[YfreqDomain,frequencyRange] = 正FFT(y,Fs);

正FFT =图;

stem(frequencyRange,abs(YfreqDomain));

set(positiveFFT,’Position’,[500,500,500,300])

xlabel(‘频率 (Hz)’)

ylabel(‘幅度’)

title(‘使用正FFT函数’)

网格

轴([0,20,0,1.5])

效果如下:

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论