声音输入MIC与MONO

本文介绍了在Arduino项目中使用MIC和MONO两种声音输入方式的研究背景和目的。整体思路是通过arduino UNO、Voice Recognition模块和mp3实现语音控制播放器。目前目标是深入了解麦克风拾音,特别是单声道(MONO)的概念和应用场景,讨论了Stereo与Mono在音响效果和定位感上的区别,并给出了实际录音中如何选择的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究的背景

前些日子研究了arduino的MP3,没有深入的了解声音输入的方式。现在回顾一下那个小项目的整体框架,做一些思考的工作。

整体思路

材料: arduino UNO + Voice Recognition语音识别模块 + mp3 + 3w的喇叭
功能:实现语音控制mp3的播放,暂停等基础的播放器的功能

现在的目的

由于没有对 Voice Recognition语音识别模块深入的了解,许多功能都没有使用到,今天又拿起来这个模块,准备了解一下其他的功能。今天入手了MIC和MONO两个音频输入方式。

MIC麦克风

百度词条:MIC是由Microphone缩写而来的词语,指麦克风。麦克风学名为传声器,是一件简单的用来拾取和传送声音的装置,可以将声音信号转换为电信号,俗称话筒。
这些其实已经足够我使用了。

MONO单声道拾音

附上链接:现场收音该收立体声(Stereo) 还是单声道(Mono)呢?https://dcfilms.tv/blog/現場收音該收立體聲stereo-還是單聲道mono呢?/

上面的链接中的文章对单声道拾音做了详细的说明。下面的我直

### 获取安卓设备麦克风声音强度(分贝) 在安卓开发中,可以通过 `AudioRecord` 类来捕获音频数据并计算其对应的分贝值。具体实现方法如下: #### 原理说明 分贝值的计算基于声波振幅的变化。通常情况下,可以使用以下公式将振幅转换为分贝值[^2]: \[ \text{dB} = 20 \times \log_{10}\left(\frac{\text{a1}}{\text{a0}}\right) \] 其中: - \( a1 \): 当前测量的声音振幅。 - \( a0 \): 设备能够检测到的最小声音振幅。 为了简化处理,在某些场景下可以直接假设 \( a0 = 1 \),从而减少额外参数的影响。 #### 实现代码 以下是通过 Android API 计算麦克风音量分贝值的一个简单示例: ```java import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class AudioRecordDemo { private static final int SAMPLE_RATE = 8000; // 采样率 private static final int CHANNEL_CONFIG = AudioFormat.CHANNEL_IN_MONO; // 单声道 private static final int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT; // PCM编码 private static final int BUFFER_SIZE = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT); private AudioRecord audioRecord; private boolean isRecording = false; public void start() { if (audioRecord == null || !isRecording) { audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, BUFFER_SIZE); audioRecord.startRecording(); isRecording = true; } } public void stop() { if (audioRecord != null && isRecording) { audioRecord.stop(); audioRecord.release(); audioRecord = null; isRecording = false; } } public double getNoiseLevel() { short[] buffer = new short[BUFFER_SIZE]; int readSize = audioRecord.read(buffer, 0, BUFFER_SIZE); if (readSize > 0) { long sumOfSquares = 0; for (int i = 0; i < readSize; ++i) { sumOfSquares += buffer[i] * buffer[i]; } double rms = Math.sqrt(sumOfSquares / readSize); // RMS值 return 20 * Math.log10(rms); // 转换成分贝值 } else { return 0; } } } ``` 上述代码实现了以下几个功能: 1. 初始化 `AudioRecord` 对象以监听麦克风输入。 2. 提供了一个 `getNoiseLevel()` 方法用于返回当前的噪声水平(单位:分贝)。 3. 使用均方根(RMS)算法计算振幅,并将其转化为分贝值。 需要注意的是,实际应用过程中可能会遇到一些波动较大的情况,例如吹气时可能导致异常高的分贝值[^1]。因此建议加入平滑滤波器或其他机制降低干扰影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值