MATLAB中fft的频率轴怎么计算
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中fft的频率轴怎么计算相关的知识,希望对你有一定的参考价值。
假设你的信号是 8个点,采样频率是 100Hz。那么,该信号的频率是50Hz,那么频率轴每个间隔是 50/(8-1), 设为df
那么,频率轴是 0 df 2*df 3*df 4*df
也就是说,对于8个点的信号,你会得到频率间隔是 50/(8-1), 可以得到 8/2+1个频率点。
也就是说,对于N个点的信号,你会得到频率间隔是 50/(N-1), 可以得到 N/2+1个频率点。
注意,N是2的某次幂 参考技术A 下面是MATLAB演示程序中的一段关于FFT的代码。
First create some data. Consider data sampled at 1000 Hz. Start by forming a time axis for our data, running from t=0 until t=.25 in steps of 1 millisecond. Then form a signal, x, containing sine waves at 50 Hz and 120 Hz.
t = 0:.001:.25;
x = sin(2*pi*50*t) + sin(2*pi*120*t);
%%
% Add some random noise with a standard deviation of 2 to produce a noisy
% signal y. Take a look at this noisy signal y by plotting it.
y = x + 2*randn(size(t));
plot(y(1:50))
title('Noisy time domain signal')
%%
% Clearly, it is difficult to identify the frequency components from looking at
% this signal; that's why spectral analysis is so popular.
%
% Finding the discrete Fourier transform of the noisy signal y is easy; just
% take the fast-Fourier transform (FFT).
Y = fft(y,256);
%%
% Compute the power spectral density, a measurement of the energy at various
% frequencies, using the complex conjugate (CONJ). Form a frequency axis for
% the first 127 points and use it to plot the result. (The remainder of the 256
% points are symmetric.)
Pyy = Y.*conj(Y)/256;
f = 1000/256*(0:127); =====================【问】这个频率轴是怎么运算的??为什么要在前面*1000/256?还有为什么只取前面一半的点??
plot(f,Pyy(1:128))
title('Power spectral density')
xlabel('Frequency (Hz)')
%%
% Zoom in and plot only up to 200 Hz. Notice the peaks at 50 Hz and 120 Hz.
% These are the frequencies of the original signal.
plot(f(1:50),Pyy(1:50))
title('Power spectral density')
xlabel('Frequency (Hz)')
帮我理解FFT函数(Matlab)
【中文标题】帮我理解FFT函数(Matlab)【英文标题】:Help me understand FFT function (Matlab) 【发布时间】:2009-01-11 22:09:57 【问题描述】:1) 除了负频率,FFT 函数提供的最小频率是多少?是零吗? 2) 如果为零,我们如何在对数刻度上绘制零? 3)结果总是对称的?还是只是看起来是对称的? 4) 如果我使用 abs(fft(y)) 来比较 2 个信号,我会失去一些准确性吗?
【问题讨论】:
【参考方案1】:1) 除了负频率,FFT 函数提供的最小频率是多少?是零吗?
fft(y)
返回一个向量,其中包含y
的 DFT 的第 0 到第 (N-1) 个样本,其中 y(t) 应该被认为是在 0 ... N-1 上定义的(因此,y(t) 的“周期性重复”可以被认为是在 Z 上定义的周期性信号)。
fft(y)
的第一个样本对应于频率 0。
真实、离散时间、周期性信号的傅里叶变换也具有离散域,它是周期性的和厄米特的(见下文)。因此,负频率的变换是正频率对应样本的共轭。
例如,如果您将y
(的周期性重复)解释为在 Z 上定义的周期性实信号(采样周期 == 1),则 fft(y)
的域应解释为 N 个等距点 0, 2π/N ... 2π(N-1)/N。负频率 -π ... -π/N 处的变换样本是频率 π ... π/N 处的样本的共轭,并且等于频率处的样本
π ... 2π(N-1)/N.
2) 如果为零,我们如何在对数刻度上绘制零?
如果您想绘制某种Bode plot,您可以仅绘制正频率的变换,忽略对应于最低频率(特别是 0)的样本。
3) 结果总是对称的?还是只是看起来是对称的?
如果y
是实数,它有Hermitian symmetry:它的实部是对称的,它的虚部是反对称的。换句话说,它的幅度是对称的,它的相位是反对称的。
4) 如果我使用 abs(fft(y)) 比较 2 个信号,我会失去一些准确性吗?
如果您的意思是abs(fft(x - y))
,这没关系,您可以使用它来了解差异的频率分布(或误差,如果 x 是 y 的估计值)。如果您的意思是abs(fft(x)) - abs(fft(y))
(???),您至少会丢失相位信息。
【讨论】:
在 matlab 中,调用函数但告诉它忽略输入中的某些值有点棘手。因此,我建议用一个可以绘制的小值替换 0。 请注意,matlab中fft结果的前半部分是正频率(1 +1 用于提出厄米对称性,这为我节省了大量时间。【参考方案2】:好吧,如果您想了解快速傅立叶变换,您需要回到基础并了解 DFT 本身。但是,这不是你问的,所以我只是建议你在自己的时间这样做:)
但是,回答您的问题:
-
是的,(如您所说,除了负数)它为零。 N 点输入的范围是 0 到 (N-1)。
在 MATLAB 中?我不确定我是否理解您的问题 - 绘制零值,就像绘制任何其他值一样......虽然,正如 duffymo 正确指出的那样,没有自然对数为零。
它本质上类似于 sinc(正弦基数)函数。不过,它不一定是对称的。
您不会失去任何准确性,您只会得到幅度响应(但我想您已经知道了)。
【讨论】:
啊,sinc 是关于 y 轴对称的,但 sine 不是。感谢您的澄清。【参考方案3】:咨询“C 中的数值配方”,第 12 章“快速傅立叶变换”说:
频率范围从负 fc 到正 fc,其中 fc 是奈奎斯特临界频率,等于 1/(2*delta),其中 delta 是采样间隔。所以频率当然可以是负数。
你不能绘制不存在的东西。没有自然对数为零。您可以将频率绘制为 x 轴,也可以为半对数轴选择一个不包括零的范围。
频率范围内是否存在对称性取决于时域中函数的性质。您可以在频域中绘制关于 y 轴不对称的图。
我不认为采用这样的绝对值是一个好主意。您需要阅读有关卷积、校正和信号处理的更多信息以比较两个信号。
【讨论】:
关于#1,最初的问题是“除了否定之外”......因此我的回答。 在不了解要转换的函数的情况下很难做出有关频率范围的陈述。实偶函数的傅里叶变换是实偶函数,但原问题没有具体说明。 确实如此。正如您所说,在没有适当场景的情况下尝试回答问题会出现问题。【参考方案4】:-
fft 的结果可以为 0。已被其他人回答。
要绘制 0 频率,诀窍是将其设置为一个非常小的正数(为此我使用 exp(-15))。
已被其他人回答。
如果您只对幅度感兴趣,是的,您可以这样做。例如,这适用于许多图像处理问题。
【讨论】:
【参考方案5】:一半的问题:
3) FFT运算的结果取决于信号的性质;因此没有什么要求它是对称的,尽管如果是对称的,您可能会获得有关信号属性的更多信息
4) 这将比较一对信号的幅度,但那些相等并不能保证 FFT 相同(不要忘记相位)。但是,它可能足以满足您的目的,但您应该确信这一点。
【讨论】:
以上是关于MATLAB中fft的频率轴怎么计算的主要内容,如果未能解决你的问题,请参考以下文章
悬赏,请大家帮忙,MATLAB怎么用,改变声音频率(电脑软件)