Matlab 利用fft提取频率
我有一个信号,它是两个频率的线性组合,我试图用MATLAB来确定(主)信号由哪些频率组成。作为输入,我有采样率,Matlab 利用fft提取频率,matlab,signal-processing,fft,continuous-fourier,Matlab,Signal Processing,Fft,Continuous Fourier,我有一个信号,它是两个频率的线性组合,我试图用MATLAB来确定(主)信号由哪些频率组成。作为输入,我有采样率,rate和带有信号数据的行向量,segment 现在我有以下代码: N=length(segment); freq = rate*(0:N/2)/N; X = fft(segment); X=X(1:N/2+1); plot(freq*2, abs(X)) 这确实返回了一个有两个峰值的图,每个峰值位于信号所包含的频率上。现在我想提取这些频率。所以我想返回一个变量,信号,它是两个频
rate
和带有信号数据的行向量,segment
现在我有以下代码:
N=length(segment);
freq = rate*(0:N/2)/N;
X = fft(segment);
X=X(1:N/2+1);
plot(freq*2, abs(X))
这确实返回了一个有两个峰值的图,每个峰值位于信号所包含的频率上。现在我想提取这些频率。所以我想返回一个变量,信号
,它是两个频率的向量
因此,如果我的信号是由30Hz
信号和60Hz
信号的线性组合产生的,那么我想要signal=[30,60]
。我可以创建一个图表,然后确定这一点,但我想去掉中间人,只返回找到的频率,而不使用任何工具箱
如何找到所需的频率?没有工具箱:选择一些您认为可以接受的阈值,然后简单地执行
abs(x)>threshold
,这将为您提供一个索引到freq
的逻辑数组,给出高于阈值的频率。为了提高精度,您可以在生成的数组上执行类似于diff()
的操作,并查找相邻索引,然后在该序列上的连续索引上选择最大值作为“峰值”
或者,您可以sort()
值,保留最大n
(在您的案例2中)值的索引,并将其索引到频率数组中。同样地,这不是一个非常健壮的方法,但是快速而肮脏
结合以上两种技术,您可以根据排序数组迭代降低阈值,然后检查峰值的接近程度、它们的突出程度等
如果您不想自己实现这一点,请参阅下面的一站式函数
如果您愿意使用信号处理工具箱,您可以使用。这将为您提供索引,然后您可以使用这些索引对频率阵列进行索引,以获得所需的频率。或者使用
peaks=findpeaks(data,x)
语法直接提取x
位置(在您的情况下为频率)。不使用工具箱:选择一些您认为可以接受的阈值,然后只需执行abs(x)>threshold
,这将为您提供一个索引到freq
的逻辑数组,给出高于阈值的频率。为了提高精度,您可以在生成的数组上执行类似于diff()
的操作,并查找相邻索引,然后在该序列上的连续索引上选择最大值作为“峰值”
或者,您可以sort()
值,保留最大n
(在您的案例2中)值的索引,并将其索引到频率数组中。同样地,这不是一个非常健壮的方法,但是快速而肮脏
结合以上两种技术,您可以根据排序数组迭代降低阈值,然后检查峰值的接近程度、它们的突出程度等
如果您不想自己实现这一点,请参阅下面的一站式函数
如果您愿意使用信号处理工具箱,您可以使用。这将为您提供索引,然后您可以使用这些索引对频率阵列进行索引,以获得所需的频率。或者使用
peaks=findpeaks(data,x)
语法直接提取x
位置(在您的情况下为频率)。2种简单方法:
我最后做的是使用
max()
函数。这将返回峰值,然后相应的x索引将与正确的频率相对应。检索此频率后,我选择峰值周围的某个括号,并将这些索引设置为零。然后我将再次运行max()
找到第二个峰值及其对应的频率。我最后要做的是使用max()
函数。这将返回峰值,然后相应的x索引将与正确的频率相对应。检索此频率后,我选择峰值周围的某个括号,并将这些索引设置为零。然后我将再次运行max()
找到第二个峰值及其对应的频率。但如果较高的峰值在其频带内的某些频率高于第二个峰值,它将返回两个非常接近的频率,并将丢失第二个频率,对吗?@Math初学者,这就是为什么我说它不是非常稳健。唯一的简短解决方案是be求助于内置的峰值查找算法,如findpeaks()
,任何比这更长的算法都需要实现峰值查找算法