声源定位
一.简介
声音定位是人们感知周围事物的一个重要部分。即使看不到那里有什么,我们也可以根据声音大致判断出我们周围有什么。尝试在电子设备中复制相同的系统可以证明是一种有价值的方式来感知机器人、安全和一系列其他应用的环境。我们构造了一个三角形排列的麦克风来定位任意声音的方向。通过记录来自三个麦克风的输入,我们可以将记录相互关联,以识别音频记录之间的时间延迟。因为三个麦克风的物理位置是已知的,所以可以使用麦克风之间的时间延迟来估计声音的方向。估计方向后,我们在液晶显示器上用箭头显示方向。
二.整体设计思路
2.1 数学原理
在采样帧中,两个麦克风之间的近似最大时间延迟是使用以下三个参数计算得出的:1.室温下干燥空气中的声速,2.每个麦克风之间的距离,3.采样速率。
最大时间延迟=采样速率/(声速距离)= 25 kHz / (343 m/s 0.50 m)
本项目中用于计算两个信号之间时间延迟的主要数学技术是互相关,它通过沿另一个信号滑动一个信号来测量两个信号的相似性。公式如下:
2.2 硬件框图
下图说明了本项目中使用的所有外设。PIC32利用10位模数转换器(ADC)读取模拟输入,利用串行外设接口(SPI)通道写入薄膜晶体管显示器,利用另一个串行外设接口通道写入数模转换器(DAC)进行模拟输出。
2.3 硬件/软件权衡
在硬件和软件之间进行选择是实现容易的平衡,同时倾向于在微控制器中运行系统,以增加微控制器提供的灵活性。由于我们希望能够比较声音和可能的时间延迟,大多数音频处理都是在PIC32微控制器中完成的。虽然某些项目中提到使用硬件脉冲检测器来确定到达时间,但我们选择用软件来确定,因为这样可以让我们检测非脉冲的声音。一些放大和信号控制是在硬件滤波器和放大器中完成的,因为这对ADC正确读取输入信号和消除混叠是必要的。在PIC32内部,我们决定让微控制器使用直接存储器存取通道将数据传输到缓冲器,而不是让处理器高速中断来采样ADC。这允许微控制器在采样过程中进行其他处理。
三.硬件
3.1 概观
该项目的硬件包括3个麦克风电路、一个电压调节器、一个按钮、一个薄膜晶体管显示器和一个开关组成的原型板。3个麦克风电路中的每一个都包括驻极体麦克风、一组滤波器和放大器。麦克风电路的每个输出都被反馈入PIC32上的模数转换器通道。单独的线性电压调节器用于为麦克风电路供电。原型板的3.3v电源轨未被使用,因为我们发现微控制器的噪声可以进入电源轨并被放大器拾取。此外,9v电池用于提供整体电源。我们还发现5v插入式壁装电源往往会产生不必要的噪声(可能来自某些开关频率)。该按钮用于开始采样,并简单地作为上拉连接。配置了微控制器的内部下拉。薄膜晶体管显示器用于显示调试信息并指向声音的方向。麦克风电路和电压调节器焊接在焊接板上。最后,使用一个双通道12位数模转换器进行调试。这用于回放录音和输出相关波形。这些可以在示波器上看到。
3.2 麦克风电路
麦克风电路由三部分组成。首先是麦克风本身。第二是高通滤波器,用于在向放大器馈电之前去除麦克风中的任何DC值。最后是放大器,它是一个运算放大器,被配置为充当带通滤波器。麦克风电路示意图如下所示:
MCP6242是用于放大器的运算放大器。这是一款3.3V兼容轨对轨运算放大器。初始高通滤波器的截止频率约为160Hz。带通放大器上的高通滤波器被选择为与初始高通滤波器的截止值大致匹配。至于运算放大器的低通滤波器,选择该滤波器的截止频率约为725Hz。选择这些较低频率的选择是因为我们能够用原始方法获得原始采样率。使用的增益是1000:1。这将证明是一个问题,这将在后面的进一步改进部分看到。麦克风电路的每个输出都连接到一个具有模拟功能的输入/输出引脚。使用的引脚是RA0、RA1和RB3,它们对应于AN0、AN1和AN5。这些被组装成焊接板,如下所示:
3.3 按钮
按钮电路相对简单。这只是一个与330欧姆电阻串联的按钮开关。开关电路的一端是3.3V轨,另一端是PIC32的数字输入/输出引脚。PIC32配置为提供弱下拉,因此当开关打开时,输入/输出引脚读数为0,当闭合时,输入/输出引脚读数为1。开关最初连接到原板,但这最终会导致问题,因为单击开关会导致组件抖动。为了解决这个问题,将一个不同的开关焊接到一段绞合的24awg(截面积大概为0.2平方毫米)电线上,然后连接起来代替车载开关。这允许系统可以进行短距离触发。按钮开关连接到RB7,如下图所示。
3.4 薄膜晶体管显示器
薄膜晶体管显示器用于显示调试信息并指向声源方向。我们使用的器件是Adafruit,它提供薄膜晶体管显示器、薄膜晶体管显示器驱动器和SD卡读卡器(本项目未使用)。其代码是一个库,该库改编自Adafruit提供的库,用于运行带有Arduino的薄膜晶体管。薄膜晶体管分支使用了一个SPI通道和其他几个数字输入/输出引脚。薄膜晶体管显示器的引脚排列与赛ABB开发板中的配置相同。具体如下:RB0 -》D/C、RB1-》ECS、RB2-》reset、RB11-》EMOSI和RB14-》CLK。
3.5 数字模拟转换器
使用的数模转换器是MCP4822。这是我们常用的12位双通道数模转换器。数模转换器仅用于调试系统,不用于项目本身。通过以1kHz的速率向数模转换器发送波形,我们可以查看系统的输出情况。数模转换器采用标准配置,如下所示:RB4-》CS,RB5-》MOSI,RB15-》CLK。
3.6 进一步改进
对于硬件而言,进一步的改进将包括对放大器进行返工,去掉按钮电路,让音频电路触发采样。首先,选择放大器带通滤波器的频率范围是因为原始系统具有低采样频率。由于当前系统可以在25kHz下采样而没有问题,并且经过一些调整后可以增加到40kHz,因此我们可以改变低通滤波器的截止频率。比几千赫高得多。然而,一个问题是增益带宽积大约为550kHz。当增益为1000:1时,结果将系统频率限制在550kHz。但是我们应该注意,增益带宽积的特性不太好,因此芯片之间可能会有很大差异。添加高通滤波器会造成相位偏移,因为每个运算放大器可能不同,这意味着每个麦克风的相位偏移也不同。由于互相关依赖于检查输入信号的相位,这意味着峰值的位置取决于麦克风听到的声音的频率。
四.软件
4.1 概述
为了最大化系统的采样率,我们修改了时钟预分频器,使时钟频率达到60 MHz。然而,为了开始声音定位检测,需要按下按钮来激活程序,并且使用去抖状态机(有限状态机)来保持按钮的状态。首先,为了定位声音的方向,系统首先需要记录来自每个麦克风通道的读数,这是使用直接存储器访问来最小化处理器使用的,并且记录的麦克风数据存储在阵列中。第二,每个通道的记录与下一个通道互相关,并且用相应的相对定时识别互相关值的峰值点。第三,每对声道之间的相对定时将被用于通过使用定时差的相对方向和麦克风放置的物理关系的知识来计算声源的方向,以导出三个方向上的声源。最后,在薄膜晶体管显示屏上画出相应的箭头来提示结果。下一节将详细讨论软件的每个组件,还包括调试功能、实验方法和进一步的建议。
4.2 直接存储器存取和模数转换器
三个麦克风通道的模拟输入连接到三个模数转换器通道,即通道0、1和5。模数转换器配置为自动采样模式,在上一次转换完成时,将连续采样下一个数据,采样大小为三个通道,并转换为16位有符号整数。麦克风的录音是使用直接存储器存取完成的,特别是三个麦克风通道的三个直接存储器存取通道。对于每个通道,DMA最初被配置为从麦克风数据从模数转换器缓冲器传输到记录阵列,并且每次传输的整个块大小是记录阵列的大小,其被设置为采样速率乘以十分之一秒。一旦功能调用使能了直接存储器存取通道,直接存储器存取将以定时器2中断设置的速率传输16位大小的单元,该中断被配置为系统时钟/采样频率=2400个时钟周期。当整个数据块被传输时,码分多址信道将提升码分多址_电动车辆_夏令时_满标志,以表示传输完成。此外,计算线程检查所有三个DMA通道的完成标志,以开始声音定位的计算。
4.3 按钮
按钮线程持续读取按钮的输入,并使用按钮去抖状态机FSM来更新按钮的当前状态。FSM被用来适当地捕捉按钮的全部按下。按钮按下切换就绪标志,向计算线程发出信号,以直接内存分配传输开始计算。下图具体说明了FSM。
4.4 互相关
一旦麦克风数据完全记录在阵列中,将对每对麦克风记录计算互相关。互相关是在信道0和信道1、信道1和信道2、信道2和信道0上计算的。在互相关计算中,每个通道的记录值加上每个麦克风通道的恒定DC偏置,这是为每个通道独立测量的。无论如何,通过沿着第二记录完全滑动第一记录的中间部分来计算每个互相关,并且计算完全重叠的记录的点积之和,并且得到的互相关值并存储在记录大小的数组中。滑动窗口的大小是在用多个窗口大小进行实验之后选择的,并且该大小允许使用大量的记录值来寻找两个通道之间的相关性,以及足够的互相关数据来适应麦克风的物理距离在记录约束之间的最大时移量。当互相关值被计算时,三对中每一对的峰值及其索引值将被识别和记录,以计算源声音的方向。
4.5 计算方向
声源的方向是使用互相关计算期间检测到的三个峰值指数来计算的。使用3位编码来确定方向。编码的每个比特对应于峰值指数是正还是负,当指数是正时,这意味着第一次记录发生在第二次记录之前,因此第一次记录的麦克风比第二次记录的麦克风更靠近声源。编码由以下赋值构成。
接下来,使用以下逻辑使用3位编码来确定声音的方向,该逻辑将方向确定为在其他两个麦克风通道之前接收信号的麦克风通道。
通过画一个指向三个麦克风之一的箭头,结果方向将显示在薄膜晶体管显示屏上。
4.6 数模转换器(用于调试)
为了调试系统,配置了两个数模转换器通道。数模转换器配置为通过串行接口输出互相关数据,串行接口以定时器3中断设置的速率输出数据,定时器3中断配置为60kHz。输出引脚连接到示波器,以便观察和分析互相关信号,这些信号从最新的计算互相关阵列中反复流出。
4.7 尝试了另一种方法
我们尝试的第一种声音定位计算方法是连续计算每个麦克风通道与预先录制的录音的互相关。因此,由于实时计算的需求非常紧张,采样率受到很大限制。我们达到的最高采样速率在微处理器运行时为60 MHz,它太低,无法合理分辨麦克风通道之间的时序延迟。从这种方法获得的结果不能识别出符合理论直觉的一致相关性。
4.8 代码片段
下面是每个函数和线程的代码,仅供参考。
//定时器3中断服务例程
void __ISR(_TIMER_3_VECTOR, ipl2) Timer3Handler(void) {
mT3ClearIntFlag();
transfer_to_DAC_Channel_A();
transfer_to_DAC_Channel_B();
}
//计算源声音的方向
//在薄膜晶体管显示器上绘制结果
void compute_direction() {
// assigned encoding
encoding = (peak_index[0] 》 0) 《《 2 | (peak_index[1] 》 0) 《《 1 | (peak_index[2] 》 0);
direction = check_cases_identified _direction(encoding);
draw_TFT(direction);}
//交叉关联每对麦克风录音
void cross_correlate() {
for (each channel) {
for (shift range) {
for (index range) {
correlate_value += mic(channel) + biase * mic(next channel) + biase;
}
Update_new_peak_value();
}
}
}
//线程等待按钮按下来记录和调用
//交叉关联和计算方向
static PT_THREAD(protothread_computation(struct pt * pt)) {
PT_BEGIN(pt);
while (1) {
wait_until_button_pushed();
Reset_button;
Star_DMA_transfer(All_3_channels);
wait_until_all_DMA_complete();
//cross_correlation the new recordings
cross_correlation();
//compute and display direction
compute_direction();
}
PT_END(pt);
}
//这个线程更新并维护按钮的状态
static PT_THREAD(protothread_button(struct pt * pt)) {
PT_BEGIN(pt);
while (1) {
button = Read_Button_input();
// FSM for the button press debouncing
transition_case_for_button_state();
}
PT_END(pt);
}
//主要功能。配置和初始化定时器、数模转换器、模数转换器、直接存储器、薄膜晶体管、引脚、线程。
void main(void) {
// Configure timer3 interrupt
Config_Timer3(sys_clock / 1000);
// Configure timer 2 interrupt
Config_Timer2(sys_clock / sampling_rate);
/// SPI setup for DAC
Configure_SPI_for_DAC();
//Configure and enable the ADC
Enable_ADC_for_3_Channels();
// DMA Configure for 3 channels
Enable_3_DMA_Channels_on_Timer2_and_Raise_DONE_flag();
// set up i/o port pin
set_digital_input_and _pulldown(push_button_input_pin);
// config threads
PT_setup();
// setup system wide interrupts
INTEnableSystemMultiVectoredInt();
// init the threads
initialize_threads();
// config and init the display
tft_config();
// round-robin scheduler for threads
while (1) {
PT_SCHEDULE(protothread_button( & pt_button));
PT_SCHEDULE(protothread_computation( & pt_computation));
}
}
五.结果
声音定位效果很好,计算延迟很小。当系统能够捕捉麦克风电路带通范围内的正弦扫描有效部分时,该器件工作最佳,因此可以完全捕捉录音的频率特性进行比较。这意味着系统的精度取决于点击按钮的用户的精度,也取决于系统使用的运算放大器,因为这将决定上限的位置。测试设备时捕获了以下图像。
两条上迹线显示来自其中一个麦克风的记录信号,下迹线显示来自两个麦克风通道的互相关结果。互相关迹线使用高电平信号来显示数据何时开始和结束。这使我们能够看到互相关的起点和终点以及峰值的位置。在第一幅图像中,峰值明显向左移动,表明一个记录领先于另一个记录,而在另一幅图像中,峰值居中,表明两个记录大致在同一时间。虽然该系统通常是正确的,但存在一致性问题。项目范围缩小到检测与每个麦克风对齐的方向的原因是读数不一致,即使读数一致也不完全正确。这可能是麦克风电路的问题。运算放大器的增益带宽积引起的低通滤波可能会导致麦克风在输入信号上看到不同的相移。我们相信情况是这样的,因为互相关的峰值会像上面描述的那样以干净的波形返回,但是峰值会位于错误的部分。这表明麦克风电路或采样有问题。由于中央处理器时钟工作在60兆赫,模数转换器的采样频率也在兆赫范围内,所以我们通常不关心模数转换器采样之间的延迟,也不关心直接存储器将数据顺序复制到缓冲器中。这只会使麦克风电路在输入信号中产生一些不希望的相移。更糟糕的是,由于相移差可能与频率有关,并且测试信号是频率的线性扫描,这意味着采样和互相关的结果将取决于用户在频率扫描中在正确时间按下按钮的能力。这是不可靠的,因为大多数人不能捕捉到精确到不到十分之一秒的正确时间,所以如果系统也能自己触发采样会更好,因为这样会更一致。
另一方面,这个项目实际上没有任何安全问题。由于该设备只需记录音频信号并在显示器上返回方向,因此它没有任何移动部件,也不发射/辐射任何电磁波、任何声波或任何可能对周围环境和生物特别有害或干扰的能量输出。就可用性而言,该设备需要相当多的工作。首先,移除按钮将是一个关键的改变,这将提高设备的可用性,因为目前,它需要一个正确定时的按钮,这将要求用户是准确的。第二,扩展带通电路的频率范围,以允许设备检测更宽范围的声音信号。最后,使用更多麦克风通道可能会提高声音方向的检测分辨率。因此,为了充分利用该设备,需要进一步开发该设备的许多方面。
六.结论
最终设计和原始设计没有达到最初为项目设定的预期。因此,项目范围缩小到指向最近的麦克风。我们遇到的主要问题是,系统没有从每对麦克风通道之间的相对时间延迟中给出特别一致的结果。在很大程度上,系统会分辨出正确的麦克风,但是不一致意味着它多次指向错误的方向。最初,我们希望能够以高得多的分辨率,十度,分辨出一个方向。互相关代码和代码中峰值的索引似乎给出了正确的结果。互相关波形看起来像理论上的预期,但偶尔会在错误的位置出现峰值。返回峰值索引的代码似乎也会根据观察到的波形峰值给出正确的索引。因此,误导性不一致性的来源很可能不是来自计算,而是麦克风电路。如结果部分所述,麦克风电路中滤波器所选择的截止频率不是我们希望系统运行的声音范围的正确频率。此外,运算放大器增益带宽积的低通也可能导致电路对音频施加不同的相移。如果我们要重做这个项目,我们可能会降低增益,选择增益带宽积更高的运算放大器。这可能会减少或消除我们得到的相关峰值的变化。此外,我们为低通滤波器选择了不同的截止频率,这将使我们的项目能够在更高的频率范围内工作。让系统自己触发采样也可能有助于减少我们看到的不一致性。该系统没有任何重大的安全问题。该项目只需读取音频读数,并尝试确定音频的来源方向。唯一的输出显示在薄膜晶体管显示器上。薄膜晶体管显示屏不够亮,不会损害人们的视力。关于隐私,音频记录的持续时间被限制在十分之一秒,一旦采集下一个样本,它们就会被丢弃。虽然理论上可以从用于调试的数模转换器通道中提取音频,但最终版本会删除该调试功能。
声源定位
一.简介
声音定位是人们感知周围事物的一个重要部分。即使看不到那里有什么,我们也可以根据声音大致判断出我们周围有什么。尝试在电子设备中复制相同的系统可以证明是一种有价值的方式来感知机器人、安全和一系列其他应用的环境。我们构造了一个三角形排列的麦克风来定位任意声音的方向。通过记录来自三个麦克风的输入,我们可以将记录相互关联,以识别音频记录之间的时间延迟。因为三个麦克风的物理位置是已知的,所以可以使用麦克风之间的时间延迟来估计声音的方向。估计方向后,我们在液晶显示器上用箭头显示方向。
二.整体设计思路
2.1 数学原理
在采样帧中,两个麦克风之间的近似最大时间延迟是使用以下三个参数计算得出的:1.室温下干燥空气中的声速,2.每个麦克风之间的距离,3.采样速率。
最大时间延迟=采样速率/(声速距离)= 25 kHz / (343 m/s 0.50 m)
本项目中用于计算两个信号之间时间延迟的主要数学技术是互相关,它通过沿另一个信号滑动一个信号来测量两个信号的相似性。公式如下:
2.2 硬件框图
下图说明了本项目中使用的所有外设。PIC32利用10位模数转换器(ADC)读取模拟输入,利用串行外设接口(SPI)通道写入薄膜晶体管显示器,利用另一个串行外设接口通道写入数模转换器(DAC)进行模拟输出。
2.3 硬件/软件权衡
在硬件和软件之间进行选择是实现容易的平衡,同时倾向于在微控制器中运行系统,以增加微控制器提供的灵活性。由于我们希望能够比较声音和可能的时间延迟,大多数音频处理都是在PIC32微控制器中完成的。虽然某些项目中提到使用硬件脉冲检测器来确定到达时间,但我们选择用软件来确定,因为这样可以让我们检测非脉冲的声音。一些放大和信号控制是在硬件滤波器和放大器中完成的,因为这对ADC正确读取输入信号和消除混叠是必要的。在PIC32内部,我们决定让微控制器使用直接存储器存取通道将数据传输到缓冲器,而不是让处理器高速中断来采样ADC。这允许微控制器在采样过程中进行其他处理。
三.硬件
3.1 概观
该项目的硬件包括3个麦克风电路、一个电压调节器、一个按钮、一个薄膜晶体管显示器和一个开关组成的原型板。3个麦克风电路中的每一个都包括驻极体麦克风、一组滤波器和放大器。麦克风电路的每个输出都被反馈入PIC32上的模数转换器通道。单独的线性电压调节器用于为麦克风电路供电。原型板的3.3v电源轨未被使用,因为我们发现微控制器的噪声可以进入电源轨并被放大器拾取。此外,9v电池用于提供整体电源。我们还发现5v插入式壁装电源往往会产生不必要的噪声(可能来自某些开关频率)。该按钮用于开始采样,并简单地作为上拉连接。配置了微控制器的内部下拉。薄膜晶体管显示器用于显示调试信息并指向声音的方向。麦克风电路和电压调节器焊接在焊接板上。最后,使用一个双通道12位数模转换器进行调试。这用于回放录音和输出相关波形。这些可以在示波器上看到。
3.2 麦克风电路
麦克风电路由三部分组成。首先是麦克风本身。第二是高通滤波器,用于在向放大器馈电之前去除麦克风中的任何DC值。最后是放大器,它是一个运算放大器,被配置为充当带通滤波器。麦克风电路示意图如下所示:
MCP6242是用于放大器的运算放大器。这是一款3.3V兼容轨对轨运算放大器。初始高通滤波器的截止频率约为160Hz。带通放大器上的高通滤波器被选择为与初始高通滤波器的截止值大致匹配。至于运算放大器的低通滤波器,选择该滤波器的截止频率约为725Hz。选择这些较低频率的选择是因为我们能够用原始方法获得原始采样率。使用的增益是1000:1。这将证明是一个问题,这将在后面的进一步改进部分看到。麦克风电路的每个输出都连接到一个具有模拟功能的输入/输出引脚。使用的引脚是RA0、RA1和RB3,它们对应于AN0、AN1和AN5。这些被组装成焊接板,如下所示:
3.3 按钮
按钮电路相对简单。这只是一个与330欧姆电阻串联的按钮开关。开关电路的一端是3.3V轨,另一端是PIC32的数字输入/输出引脚。PIC32配置为提供弱下拉,因此当开关打开时,输入/输出引脚读数为0,当闭合时,输入/输出引脚读数为1。开关最初连接到原板,但这最终会导致问题,因为单击开关会导致组件抖动。为了解决这个问题,将一个不同的开关焊接到一段绞合的24awg(截面积大概为0.2平方毫米)电线上,然后连接起来代替车载开关。这允许系统可以进行短距离触发。按钮开关连接到RB7,如下图所示。
3.4 薄膜晶体管显示器
薄膜晶体管显示器用于显示调试信息并指向声源方向。我们使用的器件是Adafruit,它提供薄膜晶体管显示器、薄膜晶体管显示器驱动器和SD卡读卡器(本项目未使用)。其代码是一个库,该库改编自Adafruit提供的库,用于运行带有Arduino的薄膜晶体管。薄膜晶体管分支使用了一个SPI通道和其他几个数字输入/输出引脚。薄膜晶体管显示器的引脚排列与赛ABB开发板中的配置相同。具体如下:RB0 -》D/C、RB1-》ECS、RB2-》reset、RB11-》EMOSI和RB14-》CLK。
3.5 数字模拟转换器
使用的数模转换器是MCP4822。这是我们常用的12位双通道数模转换器。数模转换器仅用于调试系统,不用于项目本身。通过以1kHz的速率向数模转换器发送波形,我们可以查看系统的输出情况。数模转换器采用标准配置,如下所示:RB4-》CS,RB5-》MOSI,RB15-》CLK。
3.6 进一步改进
对于硬件而言,进一步的改进将包括对放大器进行返工,去掉按钮电路,让音频电路触发采样。首先,选择放大器带通滤波器的频率范围是因为原始系统具有低采样频率。由于当前系统可以在25kHz下采样而没有问题,并且经过一些调整后可以增加到40kHz,因此我们可以改变低通滤波器的截止频率。比几千赫高得多。然而,一个问题是增益带宽积大约为550kHz。当增益为1000:1时,结果将系统频率限制在550kHz。但是我们应该注意,增益带宽积的特性不太好,因此芯片之间可能会有很大差异。添加高通滤波器会造成相位偏移,因为每个运算放大器可能不同,这意味着每个麦克风的相位偏移也不同。由于互相关依赖于检查输入信号的相位,这意味着峰值的位置取决于麦克风听到的声音的频率。
四.软件
4.1 概述
为了最大化系统的采样率,我们修改了时钟预分频器,使时钟频率达到60 MHz。然而,为了开始声音定位检测,需要按下按钮来激活程序,并且使用去抖状态机(有限状态机)来保持按钮的状态。首先,为了定位声音的方向,系统首先需要记录来自每个麦克风通道的读数,这是使用直接存储器访问来最小化处理器使用的,并且记录的麦克风数据存储在阵列中。第二,每个通道的记录与下一个通道互相关,并且用相应的相对定时识别互相关值的峰值点。第三,每对声道之间的相对定时将被用于通过使用定时差的相对方向和麦克风放置的物理关系的知识来计算声源的方向,以导出三个方向上的声源。最后,在薄膜晶体管显示屏上画出相应的箭头来提示结果。下一节将详细讨论软件的每个组件,还包括调试功能、实验方法和进一步的建议。
4.2 直接存储器存取和模数转换器
三个麦克风通道的模拟输入连接到三个模数转换器通道,即通道0、1和5。模数转换器配置为自动采样模式,在上一次转换完成时,将连续采样下一个数据,采样大小为三个通道,并转换为16位有符号整数。麦克风的录音是使用直接存储器存取完成的,特别是三个麦克风通道的三个直接存储器存取通道。对于每个通道,DMA最初被配置为从麦克风数据从模数转换器缓冲器传输到记录阵列,并且每次传输的整个块大小是记录阵列的大小,其被设置为采样速率乘以十分之一秒。一旦功能调用使能了直接存储器存取通道,直接存储器存取将以定时器2中断设置的速率传输16位大小的单元,该中断被配置为系统时钟/采样频率=2400个时钟周期。当整个数据块被传输时,码分多址信道将提升码分多址_电动车辆_夏令时_满标志,以表示传输完成。此外,计算线程检查所有三个DMA通道的完成标志,以开始声音定位的计算。
4.3 按钮
按钮线程持续读取按钮的输入,并使用按钮去抖状态机FSM来更新按钮的当前状态。FSM被用来适当地捕捉按钮的全部按下。按钮按下切换就绪标志,向计算线程发出信号,以直接内存分配传输开始计算。下图具体说明了FSM。
4.4 互相关
一旦麦克风数据完全记录在阵列中,将对每对麦克风记录计算互相关。互相关是在信道0和信道1、信道1和信道2、信道2和信道0上计算的。在互相关计算中,每个通道的记录值加上每个麦克风通道的恒定DC偏置,这是为每个通道独立测量的。无论如何,通过沿着第二记录完全滑动第一记录的中间部分来计算每个互相关,并且计算完全重叠的记录的点积之和,并且得到的互相关值并存储在记录大小的数组中。滑动窗口的大小是在用多个窗口大小进行实验之后选择的,并且该大小允许使用大量的记录值来寻找两个通道之间的相关性,以及足够的互相关数据来适应麦克风的物理距离在记录约束之间的最大时移量。当互相关值被计算时,三对中每一对的峰值及其索引值将被识别和记录,以计算源声音的方向。
4.5 计算方向
声源的方向是使用互相关计算期间检测到的三个峰值指数来计算的。使用3位编码来确定方向。编码的每个比特对应于峰值指数是正还是负,当指数是正时,这意味着第一次记录发生在第二次记录之前,因此第一次记录的麦克风比第二次记录的麦克风更靠近声源。编码由以下赋值构成。
接下来,使用以下逻辑使用3位编码来确定声音的方向,该逻辑将方向确定为在其他两个麦克风通道之前接收信号的麦克风通道。
通过画一个指向三个麦克风之一的箭头,结果方向将显示在薄膜晶体管显示屏上。
4.6 数模转换器(用于调试)
为了调试系统,配置了两个数模转换器通道。数模转换器配置为通过串行接口输出互相关数据,串行接口以定时器3中断设置的速率输出数据,定时器3中断配置为60kHz。输出引脚连接到示波器,以便观察和分析互相关信号,这些信号从最新的计算互相关阵列中反复流出。
4.7 尝试了另一种方法
我们尝试的第一种声音定位计算方法是连续计算每个麦克风通道与预先录制的录音的互相关。因此,由于实时计算的需求非常紧张,采样率受到很大限制。我们达到的最高采样速率在微处理器运行时为60 MHz,它太低,无法合理分辨麦克风通道之间的时序延迟。从这种方法获得的结果不能识别出符合理论直觉的一致相关性。
4.8 代码片段
下面是每个函数和线程的代码,仅供参考。
//定时器3中断服务例程
void __ISR(_TIMER_3_VECTOR, ipl2) Timer3Handler(void) {
mT3ClearIntFlag();
transfer_to_DAC_Channel_A();
transfer_to_DAC_Channel_B();
}
//计算源声音的方向
//在薄膜晶体管显示器上绘制结果
void compute_direction() {
// assigned encoding
encoding = (peak_index[0] 》 0) 《《 2 | (peak_index[1] 》 0) 《《 1 | (peak_index[2] 》 0);
direction = check_cases_identified _direction(encoding);
draw_TFT(direction);}
//交叉关联每对麦克风录音
void cross_correlate() {
for (each channel) {
for (shift range) {
for (index range) {
correlate_value += mic(channel) + biase * mic(next channel) + biase;
}
Update_new_peak_value();
}
}
}
//线程等待按钮按下来记录和调用
//交叉关联和计算方向
static PT_THREAD(protothread_computation(struct pt * pt)) {
PT_BEGIN(pt);
while (1) {
wait_until_button_pushed();
Reset_button;
Star_DMA_transfer(All_3_channels);
wait_until_all_DMA_complete();
//cross_correlation the new recordings
cross_correlation();
//compute and display direction
compute_direction();
}
PT_END(pt);
}
//这个线程更新并维护按钮的状态
static PT_THREAD(protothread_button(struct pt * pt)) {
PT_BEGIN(pt);
while (1) {
button = Read_Button_input();
// FSM for the button press debouncing
transition_case_for_button_state();
}
PT_END(pt);
}
//主要功能。配置和初始化定时器、数模转换器、模数转换器、直接存储器、薄膜晶体管、引脚、线程。
void main(void) {
// Configure timer3 interrupt
Config_Timer3(sys_clock / 1000);
// Configure timer 2 interrupt
Config_Timer2(sys_clock / sampling_rate);
/// SPI setup for DAC
Configure_SPI_for_DAC();
//Configure and enable the ADC
Enable_ADC_for_3_Channels();
// DMA Configure for 3 channels
Enable_3_DMA_Channels_on_Timer2_and_Raise_DONE_flag();
// set up i/o port pin
set_digital_input_and _pulldown(push_button_input_pin);
// config threads
PT_setup();
// setup system wide interrupts
INTEnableSystemMultiVectoredInt();
// init the threads
initialize_threads();
// config and init the display
tft_config();
// round-robin scheduler for threads
while (1) {
PT_SCHEDULE(protothread_button( & pt_button));
PT_SCHEDULE(protothread_computation( & pt_computation));
}
}
五.结果
声音定位效果很好,计算延迟很小。当系统能够捕捉麦克风电路带通范围内的正弦扫描有效部分时,该器件工作最佳,因此可以完全捕捉录音的频率特性进行比较。这意味着系统的精度取决于点击按钮的用户的精度,也取决于系统使用的运算放大器,因为这将决定上限的位置。测试设备时捕获了以下图像。
两条上迹线显示来自其中一个麦克风的记录信号,下迹线显示来自两个麦克风通道的互相关结果。互相关迹线使用高电平信号来显示数据何时开始和结束。这使我们能够看到互相关的起点和终点以及峰值的位置。在第一幅图像中,峰值明显向左移动,表明一个记录领先于另一个记录,而在另一幅图像中,峰值居中,表明两个记录大致在同一时间。虽然该系统通常是正确的,但存在一致性问题。项目范围缩小到检测与每个麦克风对齐的方向的原因是读数不一致,即使读数一致也不完全正确。这可能是麦克风电路的问题。运算放大器的增益带宽积引起的低通滤波可能会导致麦克风在输入信号上看到不同的相移。我们相信情况是这样的,因为互相关的峰值会像上面描述的那样以干净的波形返回,但是峰值会位于错误的部分。这表明麦克风电路或采样有问题。由于中央处理器时钟工作在60兆赫,模数转换器的采样频率也在兆赫范围内,所以我们通常不关心模数转换器采样之间的延迟,也不关心直接存储器将数据顺序复制到缓冲器中。这只会使麦克风电路在输入信号中产生一些不希望的相移。更糟糕的是,由于相移差可能与频率有关,并且测试信号是频率的线性扫描,这意味着采样和互相关的结果将取决于用户在频率扫描中在正确时间按下按钮的能力。这是不可靠的,因为大多数人不能捕捉到精确到不到十分之一秒的正确时间,所以如果系统也能自己触发采样会更好,因为这样会更一致。
另一方面,这个项目实际上没有任何安全问题。由于该设备只需记录音频信号并在显示器上返回方向,因此它没有任何移动部件,也不发射/辐射任何电磁波、任何声波或任何可能对周围环境和生物特别有害或干扰的能量输出。就可用性而言,该设备需要相当多的工作。首先,移除按钮将是一个关键的改变,这将提高设备的可用性,因为目前,它需要一个正确定时的按钮,这将要求用户是准确的。第二,扩展带通电路的频率范围,以允许设备检测更宽范围的声音信号。最后,使用更多麦克风通道可能会提高声音方向的检测分辨率。因此,为了充分利用该设备,需要进一步开发该设备的许多方面。
六.结论
最终设计和原始设计没有达到最初为项目设定的预期。因此,项目范围缩小到指向最近的麦克风。我们遇到的主要问题是,系统没有从每对麦克风通道之间的相对时间延迟中给出特别一致的结果。在很大程度上,系统会分辨出正确的麦克风,但是不一致意味着它多次指向错误的方向。最初,我们希望能够以高得多的分辨率,十度,分辨出一个方向。互相关代码和代码中峰值的索引似乎给出了正确的结果。互相关波形看起来像理论上的预期,但偶尔会在错误的位置出现峰值。返回峰值索引的代码似乎也会根据观察到的波形峰值给出正确的索引。因此,误导性不一致性的来源很可能不是来自计算,而是麦克风电路。如结果部分所述,麦克风电路中滤波器所选择的截止频率不是我们希望系统运行的声音范围的正确频率。此外,运算放大器增益带宽积的低通也可能导致电路对音频施加不同的相移。如果我们要重做这个项目,我们可能会降低增益,选择增益带宽积更高的运算放大器。这可能会减少或消除我们得到的相关峰值的变化。此外,我们为低通滤波器选择了不同的截止频率,这将使我们的项目能够在更高的频率范围内工作。让系统自己触发采样也可能有助于减少我们看到的不一致性。该系统没有任何重大的安全问题。该项目只需读取音频读数,并尝试确定音频的来源方向。唯一的输出显示在薄膜晶体管显示器上。薄膜晶体管显示屏不够亮,不会损害人们的视力。关于隐私,音频记录的持续时间被限制在十分之一秒,一旦采集下一个样本,它们就会被丢弃。虽然理论上可以从用于调试的数模转换器通道中提取音频,但最终版本会删除该调试功能。
举报