首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何用Java声音确定频率(赫兹,实时)

如何用Java声音确定频率(赫兹,实时)
EN

Software Engineering用户
提问于 2012-02-21 15:08:58
回答 3查看 18.8K关注 0票数 7

我一直在环顾四周,发现了一些与我的问题相似的问题,但我对答案从来都不满意。我或多或少是一个Java n00b,虽然我对C++有一定的精通,我认为自己是一个中级到高级的程序员。我想用Java编写一个程序,它的功能类似于调谐器--我想要做的是记录一台仪器大约3秒钟的音高,并测量平均偏差。(这是给乐队的。)

我在想的是,我会有大量的数字,数组中的每个条目都是一个频率上的数字。我想要能够循环通过数组,并计算平均赫兹显示在屏幕或其他什么。因此,我想做的是有某种方式的“轮询”(因为没有一个更好的词)麦克风,看看什么频率被输入了正确的那一刻。

有没有一种简单的方式来接受来自麦克风的赫兹音频输入?这将在Java中,在Windows平台下进行。

EN

回答 3

Software Engineering用户

发布于 2012-02-22 06:36:23

你需要做一些频谱分析。取一小块音频数据,大概256个样本,然后计算出每一段数据的快速傅里叶变换(FFT)。然而,傅里叶变换本身是不够的,因为在短样本中分割声音的过程会带来一些失真。这种失真将主要发生在更高的频率上。对于基音检测,你可以简单地用低通滤波器过滤掉这个失真。或者,你可以窗口你的声音样本,通常使用汉宁或布莱克曼窗口函数(基本上是不同的正弦斜率)。为了提高时间分辨率,您还应该重叠您所采集的单个样本。最后,你应该把你的个人光谱平均超过你想要分析的时间。

所有这些都会给你一个叫做功率谱密度函数的东西。这种导出它的方法称为Welch方法。因此,如果您幸运的话,Java声音将包括一个计算其中之一的方法。在许多信号处理环境中,这将被称为“突出”或“私营部门司”。

当然,频谱将使用对数频率(更多的频率点向高频率),振幅很可能是非规范化和线性的,而不是简单的dB值。此外,你还必须找到一个很好的方法来找出你的实际音高频率在所有的谐波噪声等。

我想说的是:要么你的库有一个简单的函数来做你想做的事情,要么这个东西太复杂了,没有一个简单的答案。抱歉的。

票数 4
EN

Software Engineering用户

发布于 2012-02-22 07:48:28

我建议你阅读一些关于数字信号处理的教程或教科书。你想做的事情其实是相当复杂的。使它变得复杂的一些事情是:

  • 音频样本将来自PCM (脉冲编码调制)样本中的声卡。这只是时间域样本的一个奇特的术语。也就是说,进入麦克风的模拟声波是在一个规则的间隔内采样的,然后给出这些样本作为数字。这并不直接给出任何频率信息,您将不得不执行FFT来将时域数据转换为频域。
  • 即使在FFT之后,你仍然没有你想要的频率阵列。你所拥有的是在每个采样频率上的一个数量级数组。因此,你必须做一些检测,以确定哪些频率实际存在于你的信号中。这可能是一个简单的阈值和峰值选择,或更多的东西涉及。
  • 除了这一困难之外,在利用FFT在时间分辨率和频率分辨率之间进行频谱分析时,还存在一种折衷。如果你想获得更多的频率分辨率,你必须牺牲时间分辨率。例如,如果您希望能够检测到以44100 Hz采样的信号中的1Hz变化,则需要执行44100个样本的快速傅立叶变换。嗯,44100个样本是一秒钟的数据,这意味着即使你能检测到1Hz分辨率的信号,你也不知道在那一秒它发生在哪里。这就是为什么许多基音检测算法使用时域方法,如自相关法来寻找基音。
  • 另一个困难是,一个仪器不能产生纯音(单频),但也会产生一些谐波。所以你不仅会有真正的音高频率,还会有其他的频率出现在信号中,你将不得不考虑。

所有这些并不是为了阻止你去做这个项目,我只是想列出你在做这个项目时可能面临的一些问题。我做过一个类似的项目,并遇到了这些问题。

票数 1
EN

Software Engineering用户

发布于 2012-02-21 16:40:48

这取决于您获取数据的格式,最有效的方法是直接PCM,它实际上只是声音流的样本(以及您可能从大多数小鼠API中得到什么)。

要从这得到频率,你需要傅里叶变换样本。这将导致一组值(每个频率一个)。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/136215

复制
相关文章
C++:43---派生类向基类转换、静态/动态的类变量
一、继承中类的类型转换规则 我们普通的编程规则规定,如果我们想把引用或指针绑定到一个对象上,则引用或指针的类型必须与所绑定的对象的类型一致或者对象的类型含有一种可接受的const类型转换规则。但是继承关系中的类比较例外,其规则如下: ①我们可以将基类的指针或引用绑定到派生对象上 #include <iostream>class A {};class B:public A{};int main(){ A *a; B b; a = &b; return 0;} ②即使不是指针/引用类型,我们也可以将派生类转换为
用户3479834
2021/02/03
1.8K0
C++:43---派生类向基类转换、静态/动态的类变量
scala(十一) 派生类与派生对象
Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念)。但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,该对象为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明。
用户1483438
2022/04/15
5310
CWnd的派生类-3、CDialog类
对话框与普通窗口的区别仅在于,对话框是通过对话框模板建立起来的。只需要一个以模板为实参的创建命令,如CDialog::Create(),就可以完成对话框窗口及其子控件的创建工作,所有创建细节都由对话框模板来指示。而对于普通窗口,窗口及其包含的子控件必须逐一创建,而且要指定窗口风格等详细参数。对话框是最基本的可视化编程方法,一个应用程序往往包含众多的对话框资源模板和封装类,而普通窗体(包括框架窗体)却寥寥无几。但对话框的使用,只是方便了窗体和控件的创建过程,其本质与普通窗体无任何区别。
全栈程序员站长
2022/07/05
1.3K0
基类和派生类
  在面向对象设计中,被定义为包含所有实体共性的class类型,被称为“基类”。-百度百科
全栈程序员站长
2022/09/20
1K0
派生类的构造过程
1、先基类、后对象、再子类 多继承,初始化顺序跟基类的声明顺序有关,从左到右。 对象 ,与声明类的顺序有关,从上到下。
我与梦想有个约会
2023/10/20
1500
派生类的构造过程
C++中类,对象,封装,继承(派生),多态
类就是同一类事物的总称,比如我(一个对象)可以讲话,那么基本上所有人都具备这个属性,就将我这一类的对象称为类,类的思想就是这样产生的。更恰当的描述:类就是世间事物的抽象称呼,而对象就是这个事物相对应的实体,人类就是一个类,写博文的我,看博文的你就是人类这个类的实例化,这也是为什么人类里面有个类,动物类,植物类,都有一个类,单说一个动物类,我们只能知道是动物,,却无法确定是那种动物,而对象就是具体实例化动物。在C++语言中,类中对象的行为是以函数(方法)的形式定义的,对象的属性是以成员变量的形式定义的,而类包括对象的属性和函数。
花狗Fdog
2022/01/11
1.1K0
C++中类,对象,封装,继承(派生),多态
C++ 类的继承与派生
本文探讨了C++类的继承与派生,介绍了不同的继承方式,包括公有继承、私有继承和保护继承,并说明了C++中类的多态性。同时,文章还介绍了一种在派生类中访问基类成员的方法,即使用作用域解析运算符“.”。此外,文章还介绍了C++中的虚函数和纯虚函数,并说明了C++中的接口和抽象类。
chaibubble
2018/01/02
1.1K0
从TypeScript的类中派生接口[每日前端夜话0xAE]
大多数面向对象编程语言都鼓励编程到接口【https://tuhrig.de/programming-to-an-interface/】的模式。TypeScript 当然支持这一点,你可以创建一个或多个接口,然后再定义生成这个接口实例的类(或工厂)。
疯狂的技术宅
2019/08/23
8660
从TypeScript的类中派生接口[每日前端夜话0xAE]
继承、派生、新式类与经典类
Downwards is the only way forwards .——《盗梦空间》
GH
2019/12/12
5750
类与对象,类的继承,类的派生,类的组合,多态
在python中先有类再有对象,类和对象,你可以看成,类是把对象的相同特征和相同方法汇总再一起,再根据类来生成对象,这个对象具有类的特征与方法
小小咸鱼YwY
2019/07/24
1.2K0
Python使用元类约束派生类中必须实现指定的成员
创建派生类时指定元类,用来控制和约束派生类的创建过程,对派生类中的成员进行一定的限制。
Python小屋屋主
2021/12/29
1K0
Python使用元类约束派生类中必须实现指定的成员
Python中类变量、成员变量、局部变量的区别
class A:v1 = 100 # 类变量def __init__(self):self.v2 = 200 # 成员变量v3 = 300 # 局部变量类变量可以由类名统一修改:A.v1 = 300# 则每一个A实例里v1都变成300成员变量只能由实例自己改变:A.v2 # 这个是错的。a = A()a.v2 # 这个是可以访问的。局部变量只在函数内部生效
狼啸风云
2020/10/16
4.5K0
基类派生类多态虚函数?
通常在层次关系的根部有一个基类,其他类则直接或间接的从基类继承而来,这些继承得到的类称为派生类。基类负责定义在层次关系中所有类共同拥有的成员,而每个派生类定义各自特有的成员。
洁洁
2023/10/10
2090
c++-基类与派生类
友元函数必须在类中进行声明而在类外定义,声明时须在函数返回类型前面加上关键字friend。友元函数虽不是类的成员函数,但它可以访问类中的私有和保护类型数据成员。
kdyonly
2023/03/03
4010
java中类变量和实例变量的实质区别
相对于static(静态的)或说类的, 本章开始提到的都是instance(实例的)或说对象的。 每个对象都有自己的一份儿对象域或实例域,相互之间没关系, 不共享。 我们可以从对象中访问实例变量。
马克java社区
2021/03/15
2K0
java中类变量和实例变量的实质区别
虚拟变量在模型中的作用
实际场景中,有很多现象不能单纯的进行定量描述,只能用例如“出现”“不出现”这样的形式进行描述,这种情况下就需要引入虚拟变量。例如即将到来的女生节,每年的这个时候毛绒玩具的销量都会上升,说明女生节对毛绒玩具的销量产生了一定影响,但是这个影响程度又很难界定,这时只能定义一个虚拟变量去描述事情“发生”与“不发生”了。
许卉
2019/07/15
4.4K0
解决cpp添加QObject派生类的问题
一般我们继承QObject类在头文件中添加,但是有时候需要在源文件中添加。这样就会不可避免地出现编译错误。那么我们该究竟怎么解决它呢? 问题重现 执行下列源码会报以下错误: error: undefined reference to `vtable for Object' 错误: 未定义引用'Object'的虚函数表 问题源码: /* main.cpp */ #include <QCoreApplication> class Object : public QObject { Q_OBJECT p
Qt君
2019/07/15
1.9K0
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
从people(人员)类派生出student(学生)类 添加属性:班号char classNO[7];从people类派生出teacher(教师)类, 添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生graduate(研究生)类,添加属性:专业char subject[21]、 导师char teacher_adviser[21];从graduate类和teacher类派生出TA(助教生)类, 注意
Enterprise_
2019/03/01
1.1K0
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
C++继承和派生练习(一)--关于从people(人员)类派生出student(学生)类等
从people(人员)类派生出student(学生)类 添加属性:班号char classNO[7];从people类派生出teacher(教师)类, 添加属性:职务char principalship[11]、部门char department[21]。 从student类中派生graduate(研究生)类,添加属性:专业char subject[21]、 导师char teacher_adviser[21];从graduate类和teacher类派生出TA(助教生)类, 注意虚基类
Enterprise_
2018/05/18
2.6K0
c++继承 基类 派生类 虚函数
类和类的关系有组合、继承和代理。继承的本质就是代码复用。子类继承父类中的一些东西,父类也称为基类,子类也称为派生类。派生类继承了基类除构造函数以外的所有成员。
用户7886150
2021/02/03
1.1K0

相似问题

模型绑定&派生模型类

11

Django模型派生类

11

修改派生类中的变量

10

访问派生类中的基类变量

20

派生类共享类变量?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文