jjzjj

FFT之频率与幅值的确定

蘑菇传奇 2024-05-17 原文

FFT也就是快速傅里叶变换。经过快速傅里叶变换后会得到一串复数。

下面要讲两个问题:1、如何获取频率;2、如何获取幅值

傅里叶变换并没对频率进行任何计算,频率只与采样率和进行傅里叶变换的点数相关。

FFT变换完第一个数时0Hz频率,0Hz就是没有波动,没有波动有个专业一点的说法,叫直流分量。
后面第二个复数对应的频率是0Hz+频谱分辨率,每隔一个加一次,频谱分辨率Δf计算公式如下:

Δf=Fs/N

式中,Fs为采样率,N为FFT的点数也是采样点数,因此只要Fs和N定了,频域的分辨率就定下来了。

FFT变换后的第一个实数 - 直流分量

FFT之后的第一个结果表示了时域信号中的直流成分的多少,直流信号代表和基准0的偏移量,但是这个结果不是直流的幅值。

看一个例子:

输入序列

oneWave = [1,1,1,1,1,1,1,1];

进行变换

fft(oneWave)

输出

8 0 0 0 0 0 0 0

oneWave 的直流分量是1,但计算结果是8,这里又引入一个问题,FFT之后的数值不是真实的幅值,需要进行转转换,第一个点需要除以N,才能还原为原来的结果,其他结果除以N/2才能还原为原来的结果。

FFT变换后的复数模 - 幅度

假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N倍。也就是说,要得出真实幅值,需要把除了第1个点(i=0)以及最后一个点(i=N/2)除以N以外,其余点需要求得的模除以N/2。

 

有关FFT之频率与幅值的确定的更多相关文章

  1. ruby - 按数组中出现的频率排序 - 2

    有没有一种有效的方法来做到这一点。我有一个数组a=[1,2,2,3,1,2]我想按升序输出出现的频率。示例[[3,1],[1,2],[2,3]]这是我的ruby​​代码。b=a.group_by{|x|x}out={}b.eachdo|k,v|out[k]=v.sizeendout.sort_by{|k,v|v} 最佳答案 a=[1,2,2,3,1,2]a.each_with_object(Hash.new(0)){|m,h|h[m]+=1}.sort_by{|k,v|v}#=>[[3,1],[1,2],[2,3]]

  2. ruby-on-rails - 在 Ruby on Rails 中根据频率对数组进行排序 - 2

    我有一个嵌套的数字数组,排列如下:ids=[[5,8,10],[8,7,25],[15,30,32],[10,8,7]]我只需要一个包含所有键的数组,无需重复,所以我使用了这个:ids=ids.flatten.uniq产生这个:ids=[5,8,10,7,25,15,30,32]由于我使用了.uniq,它消除了重复值。但是,我想根据它们在子数组中出现的频率来对值进行排序,而不是它们碰巧处于的顺序——所以像这样:ids=[8,10,7,5,25,15,30,32] 最佳答案 应该这样做:ids.flatten.group_by{|i|

  3. ruby - 从数组和频率创建散列 - 2

    我有一个数组[1,2,4,5,4,7],我想找到每个数字的频率并将其存储在哈希中。我有这段代码,但它返回NoMethodError:undefinedmethod'+'fornil:NilClassdefscore(array)hash={}array.each{|key|hash[key]+=1}end期望的输出是{1=>1,2=>1,4=>2,5=>1,7=>1} 最佳答案 在Ruby2.4+中:defscore(array)array.group_by(&:itself).transform_values!(&:size)en

  4. ruby - "Don' t run bundler as root”- 使用 root 的确切区别是什么? - 2

    如果您在以root身份登录时从命令行运行ruby​​bundler,您会收到以下警告:Don'trunBundlerasroot.Bundlercanaskforsudoifitisneeded,andinstallingyourbundleasrootwillbreakthisapplicationforallnon-rootusersonthismachine.以root身份运行bundler对它安装的gem有什么确切的区别?是否与它为每个gem安装的实际文件的权限有关?Ruby会尝试以非root用户身份访问gem文件吗(如果是,Ruby会使用哪个用户/组,我将如何找到)?如果应用

  5. ruby - 如何使用 ruby​​ 有效地获取单词频率? - 2

    示例输入:"Iwas09809home--Yes!yes!Youwas"和输出:{'yes'=>2,'was'=>2,'i'=>1,'home'=>1,'you'=>1}我的代码不起作用:defget_words_f(myStr)myStr=myStr.downcase.scan(/\w/).to_s;h=Hash.new(0)myStr.split.eachdo|w|h[w]+=1endreturnh.to_a;endprintget_words_f('Iwas09809home--Yes!yes!Youwas'); 最佳答案 这

  6. javascript - 替换文本区域中的确切文本 - 2

    我在使用jQuery时遇到了这个小问题。我想从textarea中删除特定文本。检查我的代码:文本区域值:aaaaaa我试过这个:$("#id_list").val($("#id_list").val().replace("a",""));上面的代码只有在每行中的文本是唯一的并且没有来自其他行的匹配字符时才有效。现在的问题是上面的代码删除了aa的第一个字母,而不是删除第二行a。我怎样才能让它在文本区域的一行中替换/删除一个确切的词?任何帮助将不胜感激。 最佳答案 使用单词边界。这样做:$("#id_list").val($("#id_

  7. 使用图表库的 Javascript 频率分析器 - 2

    我目前正在尝试使用网络技术(尤其是Meteor)制作频率分析仪。目前,我尝试使用创建SVG图片的GoogleCharts库。图表需要每秒刷新大约10次,性能并不令人满意。它占用了所有的CPU资源。我对Web开发有点陌生(尤其是在图形和性能问题上),所以如果您能指出正确的方向来进行我的研究,我将不胜感激。 最佳答案 我最终使用了库CanvasJs,它似乎是最快的库之一。有一个选项interactivityEnabled:false可以禁用与图表的交互,从而提高性能。即使还没有直接的Meteor集成,只需将js文件放在./client/

  8. javascript - 需要在 OR 赋值中的 yield 表达式周围加上括号的确切句法歧义是什么? - 2

    下面的代码...假设yield在生成器函数内部,并且定义了something和else等。constvalue=something||yieldelse();...在V8(Chrome或Nodejs)中生成以下内容:conststart=initial||yieldwait();^^^^^SyntaxError:Unexpectedstrictmodereservedword...在Firefox中是这样的:SyntaxError:yieldisareservedidentifier我首先在bluebird中注意到这一点coroutine我在写作。解决方法是将yieldwait()括在

  9. javascript - Java 8 Lambda 构造和 JavaScript 之间的确切区别是什么? - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我必须将Java8代码转换为JavaScript(一种方式,一生一次)。为了加快速度,我想尽可能地自动化,然后使用测试套件来解决所有遗留问题。我想知道Java8lambda和JavaScript(函数)之间的区别是什么?任何重要的不兼容性?

  10. javascript - 确定字符串中的字符频率(Javascript) - 2

    我正在研究确定字符串中字符出现频率的解决方案。字符已正确添加到我的对象中,但所有计数最终都为NaN。(我认为我通过将字符串拆分为字符数组来采用效率较低的方法,但我还是想解决这种方法。)varcharFreq=function(frequencyString){varstringArray=frequencyString.split("");varfrequencies={};for(varkinstringArray){varnowLetter=stringArray[k];if(stringArray.hasOwnProperty(k)){frequencies[nowLetter]

随机推荐