- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在进行一个有点雄心勃勃的项目,目的是在 Android 上使用耳塞或耳机实现主动降噪。
我的目标是用 Android 手机麦克风记录环境噪声,反转相位(从音频记录中提取的短值上的简单 *-1?),然后通过耳机播放反转的波形。如果延迟和振幅接近正确,它应该可以消除环境中大量的机械结构噪声。
这是我到目前为止所得到的:
@Override
public void run()
{
Log.i("Audio", "Running Audio Thread");
AudioRecord recorder = null;
AudioTrack track = null;
short[][] buffers = new short[256][160];
int ix = 0;
/*
* Initialize buffer to hold continuously recorded audio data, start recording, and start
* playback.
*/
try
{
int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
//NoiseSuppressor ns = NoiseSuppressor.create(recorder.getAudioSessionId());
//ns.setEnabled(true);
track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000,
AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
recorder.startRecording();
track.play();
/*
* Loops until something outside of this thread stops it.
* Reads the data from the recorder and writes it to the audio track for playback.
*/
while(!stopped)
{
short[] buffer = buffers[ix++ % buffers.length];
N = recorder.read(buffer,0,buffer.length);
for(int iii = 0;iii<buffer.length;iii++){
//Log.i("Data","Value: "+buffer[iii]);
buffer[iii] = buffer[iii] *= -1;
}
track.write(buffer, 0, buffer.length);
}
}
catch(Throwable x)
{
Log.w("Audio", "Error reading voice audio", x);
}
/*
* Frees the thread's resources after the loop completes so that it can be run again
*/
finally
{
recorder.stop();
recorder.release();
track.stop();
track.release();
}
}
当我发现 Android API 实际上已经有一个 NoiseSuppression 算法时,我感到非常兴奋(您会在上面看到它被注释掉了)。我用它进行了测试,发现 NoiseSuppressor 并没有做太多事情来消除恒定音调,这让我相信它实际上只是在非人声频率上执行带通滤波器。
所以,我的问题:
1) 上述代码从麦克风录音到耳机播放大约需要 250-500 毫秒。这种延迟很糟糕,减少它会很棒。如有任何建议,我们将不胜感激。
2) 无论延迟有多紧,我的理解是播放波形将与实际环境噪声波形有相位偏移。这表明我需要执行某种波形匹配来计算此偏移量并进行补偿。关于如何计算的想法?
3) 谈到延迟补偿时,它会是什么样子?我在每个周期都有一系列短路,那么 30 毫秒或 250 毫秒的延迟会是什么样子?
我知道这种方法的根本问题是手机不靠近头部的位置可能会引入一些错误,但我希望通过一些动态或固定的延迟校正,这可能是可能的克服它。
感谢您的任何建议。
最佳答案
即使您能够对延迟采取一些措施,这也是一个难题,因为您不知道手机离耳朵的距离,而且距离不是固定的(因为用户会移动耳机)电话),再加上您没有为每只耳朵配备麦克风(因此即使您的延迟为零,您也无法知道一只耳朵的波是什么,直到它到达那里)
话虽如此,您也许可以做一些可以消除高度周期性波形的事情。不过,您所能做的就是允许用户手动调整每只耳朵的时间延迟 - 因为您的耳朵本身附近没有麦克风,您无法在代码中知道您是否使问题变得更好或更糟。
关于安卓主动降噪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153516/
我有一个数组列表。 ArrayList arrayList = new ArrayList<>(); arrayList.add("timestamp"); arrayList.add("Code")
我想知道如何控制 Navlink 的类名,如果实际路径是 X,则 NavLink 的类是事件的。我在使用 Laravel 和简单的 bootstrap 之前做过它,但我不知道如何用 React 和 R
我的单页网站目前使用箭头键平滑滚动到 anchor 。问题是当您滚动到每个部分时,悬停的链接不会跟随每个部分。它仅遵循您的箭头键命令。我怎样才能改变这个?这是当前网站 ( http://www.jon
我们有一个主动/被动拓扑,其中有两个具有共享原始存储的 x86 复合体,其中在给定时刻只有一个节点可以访问共享存储(也称为主动节点)。如果主动节点发生故障转移,被动节点将启动接管并成为可以访问共享存储
有源 GPS 会消耗多少电量?没有 gps 导航器软件的开销。秒我想每 2 分钟对 gps 进行一次采样并将其保存到文件中。这将花费我多少电池电量? 我的生命周期会缩短 10% 吗? 20%? ..?
AWS今年针对主动-被动设置(全局数据存储)引入了跨区域复制。这意味着有一个用于读取/写入的主Redis群集和一个用于读取的辅助群集。 就我而言,我们想在不同区域中使用 Active-Active R
我正在使用斯坦福标记器来确定词性。但是,我想从文本中获取更多信息。是否有可能获得更多信息,例如句子的时态或是否处于主动/被动状态? 到目前为止,我使用的是非常基本的 PoS 标记方法: List> t
我尝试将 SSL 与 Active MQ 创建的 JMX 连接器一起使用,但没有成功。我能够让 SSL 与 JVM 平台 JMX 连接器一起工作,但这需要存储 keystore 和信任库密码明文,这对
RFC 1006 TCP 连接中主动连接和被动连接有何区别? 最佳答案 这里有解释:https://www.rfc-editor.org/rfc/rfc793 A passive OPEN reque
在 MarkLogic 7 中,副本是主动-主动还是主动-被动? 最佳答案 您是在询问本地磁盘故障转移(又名林复制)、数据库复制还是灵活复制? 事实上,这三个都是为主动-被动使用而设计的:换句话说,单
我正在使用 Windows Azure 网站和 Web 作业。 我有一个控制台应用程序,用于每晚下载 FTP 文件。他们最近从被动 FTP 切换为主动 FTP。我对此没有任何控制权。 所附代码在我的计
我是 JNDI 和 JMS 技术的初学者。 我的 JNDI 文件为: java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQIn
我使用 Active Android在我的项目中。试图了解更多关于它的信息,特别是关于表项属性的信息 - 类似于 ForeignKeyAction。 如果发生删除操作,我希望我的模型只删除它自己,而不
主-主双活mysql复制如何处理唯一键值。对于主键值,我们可以设置 auto_increment_increment 和 auro_increment_offset 参数以避免主键 auto_incr
我是 Linux 新手,我的应用程序在 Windows 上运行了一段时间,对于文件传输,我们使用第三方 sftp,它在主动和被动模式下都运行良好。 现在我正在迁移我的应用程序以支持 Linux 操作系
我在使用 SymmetricDS(开源版本)在 2 个 Postgres 服务器之间复制数据时遇到问题。以下是了解我的问题的相关信息: 我已经用 Vagrant 部署了 3 个服务器: symmetr
我们可以对 Azure SQL 数据库进行被动只读异步实时同步,以实现灾难恢复。 但我们的要求是在两个事件读写数据库之间实现实时同步,以便为世界不同地点的客户提供低延迟。 例如: I'm provid
我们可以对 Azure SQL 数据库进行被动只读异步实时同步,以实现灾难恢复。 但我们的要求是在两个事件读写数据库之间实现实时同步,以便为世界不同地点的客户提供低延迟。 例如: I'm provid
在我的 TCP 服务器上,我希望有: 非阻塞被动套接字具有非阻塞accept(); 接受连接后,我想执行一些身份验证,例如验证客户端提供的 ID 和密码。所以我有明确定义的协议(protocol),我
我的应用中有 anchor 链接。如果 anchor 链接处于事件状态,如何使事件样式发挥作用。 AnchorLink 最佳答案 对于当前事件链接的样式,您可以为参数 activeClassName
我是一名优秀的程序员,十分优秀!