FFT - 计算频率仓之间的精确频率

2024-01-08

我在用我在网上找到的一个不错的 FFT 库 http://www.corix.dk/Mix-FFT/mix-fft.html看看我是否可以编写一个音高检测程序。到目前为止,我已经能够成功地让库对包含一些正弦波的测试音频信号进行 FFT 计算,其中包括 440Hz 的正弦波(我使用 16384 个样本作为大小,采样率为 44100Hz)。

FFT 输出如下所示:

433.356Hz - Real: 590.644 - Imag: -27.9856 - MAG: 16529.5
436.047Hz - Real: 683.921 - Imag: 51.2798 - MAG: 35071.4
438.739Hz - Real: 4615.24 - Imag: 1170.8 - MAG: 5.40352e+006
441.431Hz - Real: -3861.97 - Imag: 2111.13 - MAG: 8.15315e+006
444.122Hz - Real: -653.75 - Imag: 341.107 - MAG: 222999
446.814Hz - Real: -564.629 - Imag: 186.592 - MAG: 105355

正如您所看到的,441.431Hz 和 438.739Hz 频段都显示出同样高的幅度输出(“MAG:”后面最右边的数字),因此很明显目标频率 440Hz 落在两者之间。提高分辨率可能是一种接近的方法,但这会增加计算时间。

如何计算两个频率区间之间的准确频率?

UPDATE:

我尝试过巴里·奎恩的“第二个估算器” http://dspguru.com/dsp/howtos/how-to-interpolate-fft-peak在DSPGuru网站上进行了讨论,并得到了很好的结果。下面显示了 440Hz 方波的结果 - 现在我只偏离了 0.003Hz!

Here is 我使用的代码 https://gist.github.com/hiromorozumi/f74fd4d5592a7f79028560cb2922d05f。我只是简单地适应了这个例子 https://github.com/vadymmarkov/Beethoven/blob/master/Source/Estimation/Strategies/QuinnsSecondEstimator.swift我发现,这是为 Swift 准备的。感谢大家的宝贵意见,这是一次很棒的学习之旅:)


为了计算“真实”频率,一旦我使用抛物线拟合算法 https://ccrma.stanford.edu/~jos/parshl/Peak_Detection_Steps_3.html。它非常适合我的用例。

这是我寻找基频的方法:

  • 计算 DFT (WOLA https://ccrma.stanford.edu/~jos/sasp/Overlap_Add_OLA_STFT_Processing.html).
  • 查找 DFT 箱中的峰值。
  • 求谐波积谱。不是最可靠也不是最精确的,但这是找到候选基频的一种非常简单的方法。
  • 根据峰值和 HPS,使用抛物线拟合算法找到基本音调频率(如果需要,还可以找到振幅)。

例如,HPS 表示基本(最强)音调集中在 bin 中x你的 DFT;如果垃圾箱x属于巅峰y,然后从峰值中获取抛物线拟合频率y这就是您正在寻找的球场。

如果您不是在寻找基本音高,而是在寻找精确的频率anybin,只需应用适合该 bin 的抛物线即可。

一些帮助您入门的代码:

struct Peak
{
    float         freq     ; // Peak frequency calculated by parabola fit algorithm. 
    float         amplitude; // True amplitude.   
    float         strength ; // Peak strength when compared to neighbouring bins.         
    uint16_t      startPos ; // Peak starting position (DFT bin).
    uint16_t      maxPos   ; // Peak location (DFT bin).
    uint16_t      stopPos  ; // Peak stop position (DFT bin).
}; 

void calculateTrueFrequency( Peak & peak, float const bins, uint32_t const fs, DFT_Magnitudes mags )
{
    // Parabola fit:
    float a = mags[ peak.maxPos - 1 ];
    float b = mags[ peak.maxPos     ];
    float c = mags[ peak.maxPos + 1 ];

    float p   = 0.5f * ( a - c ) / ( a - 2.0f * b + c );
    float bin = convert<float>( peak.maxPos ) + p;

    peak.freq      = convert<float>( fs ) * bin / bins / 2;
    peak.amplitude = b - 0.25f + ( a - c ) * p;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFT - 计算频率仓之间的精确频率 的相关文章

  • 如何捕获无线路由器的原始信号?

    我现在看到了几个项目 它们从典型无线路由器收集的无线电数据中获取新颖的空间信息 http wisee cs washington edu http wisee cs washington edu http www extremetech c
  • Python 中的滤波器设计和频率提取

    我正在开展一个项目 用 Python 查找多分量音频信号的瞬时频率 我目前正在使用巴特沃斯带通滤波器结合scipy signal lfilter提取我想要的频率区域 然后我使用分析信号 来自scipy signal hilbert 以获得瞬
  • “iddata”类型的输入参数未定义函数“minus”

    这是后续我之前遇到的一个问题 https stackoverflow com questions 45688607 我想给信号一个偏移量 然后在其中添加一些延迟并计算 RMSE 但是在求差时我遇到以下问题 我想请教以下问题 我该如何解决上述
  • 如何使用 scipy 找到最大峰值位置、索引?

    我想找到最大峰值的位置我该怎么做 我正在使用 scipy signal 来查找峰值 我希望代码返回峰值的位置 以微米为单位 如果您想找到由 确定的最高峰值scipy signal find peaks那么你可以执行以下操作 import n
  • matplotlib imshow 编辑 x 轴

    我想显示图像的幅度谱 我可以使用以下代码来做到这一点 import numpy as np import matplotlib pyplot as plt import pylab pylab gray pic pylab imread C
  • 如何从 .wav 文件中提取特定频率范围?

    I m really声音处理方面的新知识 所以也许我的问题很简单 我想要做的是使用 R 从 wav 文件中提取特定的频率范围 假设为 150 400 Hz 换句话说 我想创建另一个波形文件 wave2 其中仅包含我想要的频率分量 指定 15
  • 找到两个相似波形之间的时间偏移

    我必须比较两个时间与电压波形 由于这些波形源的特殊性 其中一个波形可以是另一个波形的时移版本 怎样才能知道是否有时移 如果是的话 多少钱 我正在 Python 中执行此操作 并希望使用 numpy scipy 库 scipy 提供了一个相关
  • Python中基于FFT的2D卷积和相关

    scipy 或其他流行的库 中是否内置了基于 FFT 的 2D 互相关或卷积函数 有这样的函数 scipy signal correlate2d 直接方法由convolveND将 对于大数据来说很慢 scipy ndimage correl
  • DSP 库 - RFFT - 奇怪的结果

    最近我一直在尝试在我的STM32F4 Discovery评估板上进行FFT计算 然后将其发送到PC 我已经调查了我的问题 我认为我对制造商提供的 FFT 函数做错了 我正在使用 CMSIS DSP 库 现在我一直在用代码生成样本 如果工作正
  • 如何在 iPhone 上进行实时声音/信号处理?

    我可能正在开发一个基于 iPhone 的应用程序 进行近乎实时的声音处理 过滤等 我想知道开始的最佳方式 我想创建一个用于录制和处理声音的音频提示吗 如上所述here http developer apple com iphone libr
  • Enthought Python 中的线程 FFT

    Numpy SciPy 中的快速傅立叶变换 FFT 不是线程化的 Enthought Python 附带 Intel MKL 数值库 该库能够进行线程 FFT 如何获得这些例程 以下代码适用于 Windows 7 Ultimate 64 位
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • 使用到达时间差对信号进行三边测量

    我在寻找或实现寻找信号源的算法时遇到一些麻烦 我的工作目标是找到声音发射器的位置 为了实现这一点 我使用了三个麦克风 我正在使用的技术是多点定位这是基于到达时间差 The 到达时间差使用发现每个麦克风之间互相关接收到的信号 我已经实现了算法
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • 在离散时间采样 IIR 滤波器系统中从采样率/截止频率转换为 pi 弧度/样本

    我正在使用 Python 和 Numpy Scipy 做一些数字滤波器工作 我正在使用 scipy signal iirdesign 生成滤波器系数 但它需要我不熟悉的格式的滤波器通带系数 wp ws float Passband and
  • 提高 Python 中的 FFT 性能

    Python 中最快的 FFT 实现是什么 看来 numpy fft 和 scipy fftpack 都基于 fftpack 而不是 FFTW fftpack 和 FFTW 一样快吗 使用多线程 FFT 或分布式 MPI FFT 怎么样 您
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 为什么在视频/图像压缩中 DCT 变换优于其他变换

    我了解了 DCT 离散余弦变换 如何在图像和视频压缩标准中使用 但为什么 DCT 比 dft 或 dst 等其他变换更受青睐呢 Because cos 0 为 1 DCT II 的第一个 第 0 个 系数是正在变换的值的平均值 这使得每个

随机推荐

  • HTML5

    我想知道这是什么意思
  • 更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...?

    假设我有一堆众所周知的价值观 就像这样 但是const char 这只是一个例子 可能更复杂 const char A A B B C C D D E E F F G G 现在假设如果某个表达式的结果位于这些表达式的子集中 我想以特定的方式
  • 简单的 yacc 语法给出错误

    我有一个关于 yacc 编译器的问题 我不编译简单的 yacc 语法 这是代码部分 anbn 0 y token A B start anbn n printf is in anbn 0 n return 0 anbn empty A an
  • before(:each) 与之前

    我是 ruby on Rails 的新手 并进行测试 之间有区别吗 before each do some test code end and before do some test code end The before方法接受一个sco
  • write()-Python 3.x 中的编码字符串

    我有一个 unicode 字符串 我想将其写入文件中 在 Python 2 中我可以这样写 open filename w write s encode utf 8 但这对于 Python 3 来说失败了 显然 s encode 返回 by
  • 如何根据文本长度增加UITextview高度,如whatsapp

    我已经使用 websocket 在我的 iOS 应用程序中实现了聊天功能 它对我来说工作得很好 问题是我想增加 UITextView 的高度 而 UITableView 应该根据 UITextView 增加的高度向上移动 谁能帮我 以下是我
  • 使用过滤器返回对象中的属性值

    尝试创建一个使用 filter 但不使用 for 或 while 循环或 foreach 函数的函数 该函数将循环遍历对象数组 仅返回其属性值 例如 function getShortMessages messages return mes
  • 带有 addrinfo 结构的智能指针

    我需要处理两个结构addrinfo指针 由于我使用 C 11 进行编码 因此我必须使代码异常安全 事实上 我的构造函数可能会抛出一个runtime error 当你不再需要那种结构时 你应该调用freeaddrinfo为了释放结构内的列表
  • MailSystem.Net 删除邮件,IndexOnServer 属性 = 0

    我在用着邮件系统 NET http mailsystem codeplex com并尝试从服务器删除消息 问题是 IndexOnServer 属性为 0 我收到以下错误 Command store 0 flags silent Delete
  • 给定单词向量(而不是单词本身),获取最相似的单词

    使用gensim models Word2Vec库 您可以提供一个模型和一个 单词 您希望找到最相似单词的列表 model gensim models Word2Vec load word2vec format model file bin
  • TFS 2017 版本定义。 WinRM - IIS Web 应用程序管理任务。在“默认网站”下创建应用程序

    我正在制定一个发布定义 它将把一个网站部署到测试 IIS 服务器 Windows Server 2012 IIS 8 我想使用 IIS Web 应用程序管理任务在 默认网站 Scott 下创建和配置应用程序或虚拟目录 当我指定 默认网站 S
  • 为什么 google.load 会导致我的页面变成空白?

    嗯 这看起来很奇怪 但我找不到解决方案 为什么这个小提琴会演奏http jsfiddle net carlesso PKkFf http jsfiddle net carlesso PKkFf 显示页面内容 然后当 google load
  • PHP 友元/包可见性

    有没有办法限制 PHP 中的可见性 就像 Java 中的 包 可见性或至少 C 中的 朋友 可见性一样 维护大型 OOP 项目并且不让任何人使用代码的任何部分的最佳实践是什么 我尽可能多地使用私有和受保护的可见性 但有时这还不够 我知道这个
  • Angularjs - 使用指令添加 ng-* 属性

    我正在尝试将简单的 ng mouseover 绑定添加到由指令管理的元素 但无法让它发挥作用 http jsbin com aqibij 2 edit http jsbin com aqibij 2 edit 我尝试在添加 ng mouse
  • 使用本地 JSON 文件填充 Jtable

    我试图从 json 文件中获取所有数据并将数据填充到 jtable 中 我已经从 json 文件中获取数据并打印输出 但是当我尝试将数据填充到 jtable 中时 我无法将数据放入 jtable 中我的循环最终将插入数据的帧相乘 请帮助我
  • 如何在 Gluon 项目中引用 android.jar

    上面是我在 Android 上部署 JavaFX 的 Gluon 项目 我的问题是我无法引用 android jar 如何解决这个问题 构建 gradle buildscript repositories jcenter dependenc
  • PHP 中声明不必要的变量会消耗内存吗?

    我通常在 PHP 中这样做是为了更好的可读性 但我不知道它是否消耗内存或有其他问题 假设我有这个代码 user getUser getUser will return an array 我可以做 email user email sendE
  • 是否可以在 React 的 useEffect 中使用自定义钩子?

    我有一个非常基本的自定义挂钩 它接受路径并从 firebase 返回文档 import React useState useEffect useContext from react import FirebaseContext from s
  • 在抛出异常时中断捕获的异常

    在 VS 调试器中 未捕获的异常会导致程序在抛出异常时 或足够接近 中断 并处于一种允许您查看该点之前的所有堆栈帧和局部变量的状态 有没有办法获得相同的结果 抛出时中断 但在特定点捕获异常 我对对所有异常甚至给定类型的所有异常执行此操作不感
  • FFT - 计算频率仓之间的精确频率

    我在用我在网上找到的一个不错的 FFT 库 http www corix dk Mix FFT mix fft html看看我是否可以编写一个音高检测程序 到目前为止 我已经能够成功地让库对包含一些正弦波的测试音频信号进行 FFT 计算 其