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 - 计算频率仓之间的精确频率 的相关文章

  • Python 中频谱图的 FFT

    我将如何使用 Python 从 WAV PCM 文件读取频率峰值 然后能够生成它的图像以进行频谱图分析 我正在尝试制作一个程序 允许您读取任何音频文件 将其转换为 WAV PCM 然后找到峰值和截止频率 Python 波库 http doc
  • fft后如何在C上均衡

    首先感谢您花时间回答 我的问题是下一个 我尝试使用 fft 快速傅立叶变换 在 C 上构建均衡器 因为现在我能够在向量 音频样本 上正确应用 fft 对其进行归一化 然后应用逆 fft 因为这里一切都好 但是当我尝试修改 fft 的结果 以
  • 在python中应用巴特沃斯带通滤波器后,如何去除信号开头的大尖峰?

    我想使用带通滤波器消除信号的趋势 我在 python 中使用了 FL 0 1 Hz 和 FH 20Hz 的巴特沃斯滤波器 但在应用这个带通滤波器后 我在去趋势信号的开始处观察到一个大尖峰 这个尖峰是做什么用的 以及如何删除 python 中
  • 如何使用 scipy 找到最大峰值位置、索引?

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

    我终于解决了我的问题here https stackoverflow com questions 20777252 to apply window function on wigner ville distribution in matla
  • 峰值检测代码

    我想计算实时信号在第一步中是否通过了一些阈值 在第一步中 我想检测真实信号是否低于这些阈值 以便检测信号中的峰值 我的Matlab代码 k 1 t 1 l 1 for i 1 length sm sm my signal if sm i g
  • 绘制图像的傅里叶变换时出现问题。 “ValueError:x 和 y 不能大于二维,但具有形状 (2592,) 和 (2592, 1, 3)”

    我正在尝试获取图像的 fft 然后使用 matplotlib 绘制该 fft 的 fraq 然而 这个错误信息 ValueError x 和 y 不能大于二维 但具有形状 2592 和 2592 1 3 我尝试像这样重塑我的 np arra
  • 图像卷积核逆滤波器的推导

    有谁知道如何计算二维滤波器的逆 假设我有一个 3x3 过滤器 0 1 0 1 1 1 0 1 0我想找到它的倒数 使用 DFT 很容易做到 但假设我想通过卷积来完成 现在 这就是问题所在 Matlab 符号不是我的专长 假设有一个 3X3
  • iOS - 加速度计的高通滤波器方程

    有人可以解释一下如何得出下面的方程来对加速度计值进行高通滤波吗 我不需要数学推导 只需要直观的解释就足够了 define kFilteringFactor 0 1 UIAccelerationValue rollingX rollingY
  • 如何在 iPhone 上进行实时声音/信号处理?

    我可能正在开发一个基于 iPhone 的应用程序 进行近乎实时的声音处理 过滤等 我想知道开始的最佳方式 我想创建一个用于录制和处理声音的音频提示吗 如上所述here http developer apple com iphone libr
  • 在 MATLAB 中调整 3D 矩阵(图像)的大小

    我有一个 3D 矩阵 MxNxK 想将其大小调整为 M xN xK 就像 matlab 中的 imresize 一样 我正在使用图像金字塔 但其结果不是很准确 需要一个更好的 有什么解决办法吗 你可以使用interp3 因为您想要插入 3D
  • 在 MATLAB 中分析 wav 文件

    所以我有这个钢琴录音 wav 格式 我能够做一个FFT整体记录并识别频率 然而 根据我读过的一些文章 最好将 wav 文件分解为多个窗口 其中每个窗口都包含一个特定的音符 为此 我需要首先绘制时域信号的 功率包络 考虑音符平均能量概念 因此
  • 这个小波变换实现正确吗?

    我正在寻找 FFT 的替代方案来用 python 创建频谱分析仪 我听说小波变换比短时 FFT 更快并且提供更好的时间精度 我查阅了这篇维基百科文章 其中介绍了 Java 中的 Haar 小波变换实现 https en wikipedia
  • 最近用 Java 编写的 FFTW 包装器

    我正在寻找最新版本的最小 Java 包装器FFTW http www fftw org FFTW 网站上列出的包装器要么已过时 jfftw 1 2 zip ftp ftp fftw org pub fftw jfftw 1 2 zip 或包
  • 在音频文件中查找音频样本(频谱图已存在)

    我正在努力实现以下目标 使用 Skype 拨打我的邮箱 有效 输入密码并告诉邮箱我要录制新的欢迎信息 有效 现在 我的邮箱告诉我在嘟嘟声后录制新的欢迎消息 我想等待蜂鸣声然后播放新消息 不起作用 我如何尝试实现最后一点 使用 FFT 和滑动
  • 有没有办法降低 scipy/numpy 精度以减少内存消耗?

    在我的 64 位 Debian Lenny 系统 4GByte RAM 4GByte 交换分区 上 我可以成功执行以下操作 v array 10000 random 512 512 512 dtype np int16 f fftn v 但
  • 使用 scipy.signal.spectrogram 在 pyqtgraph 中绘制 wavfile 的频谱

    我有一个用于音乐和语音分析的 PyQt 加 pyqtgraph 程序 我想绘制 wav 文件的频谱 使用 scipy python 包计算 我可以在 matplotlib 中完成 但由于 matplotlib 的性能 我需要切换到 pyqt
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • 提高 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

随机推荐

  • 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 计算 其