Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 利用fft提取频率_Matlab_Signal Processing_Fft_Continuous Fourier - Fatal编程技术网

Matlab 利用fft提取频率

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)) 这确实返回了一个有两个峰值的图,每个峰值位于信号所包含的频率上。现在我想提取这些频率。所以我想返回一个变量,信号,它是两个频

我有一个信号,它是两个频率的线性组合,我试图用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))
这确实返回了一个有两个峰值的图,每个峰值位于信号所包含的频率上。现在我想提取这些频率。所以我想返回一个变量,
信号
,它是两个频率的向量

因此,如果我的信号是由
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种简单方法:

  • 取返回的fft阵列,用每个峰值(一次1个)替换该部分,并用零替换(因此最终只有1个峰值)。然后在阵列上执行反向fft,以检索没有归零频率的信号

  • 如果你知道原始信号的相位-一次取一个,创建一个新的频率为该频率的信号,并将其反转(即0-信号-上升的地方现在下降!),然后将其添加到原始信号中。该频率将从音频信号中消失,需要进行fft(验证结果除外)

  • 2个简单的方法:

  • 取返回的fft阵列,用每个峰值(一次1个)替换该部分,并用零替换(因此最终只有1个峰值)。然后在阵列上执行反向fft,以检索没有归零频率的信号

  • 如果你知道原始信号的相位-一次取一个,创建一个新的频率为该频率的信号,并将其反转(即0-信号-上升的地方现在下降!),然后将其添加到原始信号中。该频率将从音频信号中消失,需要进行fft(验证结果除外)


  • 我最后做的是使用
    max()
    函数。这将返回峰值,然后相应的x索引将与正确的频率相对应。检索此频率后,我选择峰值周围的某个括号,并将这些索引设置为零。然后我将再次运行
    max()
    找到第二个峰值及其对应的频率。

    我最后要做的是使用
    max()
    函数。这将返回峰值,然后相应的x索引将与正确的频率相对应。检索此频率后,我选择峰值周围的某个括号,并将这些索引设置为零。然后我将再次运行
    max()
    找到第二个峰值及其对应的频率。

    但如果较高的峰值在其频带内的某些频率高于第二个峰值,它将返回两个非常接近的频率,并将丢失第二个频率,对吗?@Math初学者,这就是为什么我说它不是非常稳健。唯一的简短解决方案是be求助于内置的峰值查找算法,如
    findpeaks()
    ,任何比这更长的算法都需要实现峰值查找算法