matlab - 为什么使用fft后低频幅度远低于高频幅度?
问题描述
我使用 matlab 生成声音,然后通过计算机的扬声器播放,同时我使用 iphone 录制声音,最后我将“record.wav”文件发送到计算机进行分析。但是在这里我发现低频的幅度远低于高频的幅度。
声音生成代码看起来像A*sin(2*pi*697*(0:N-1)/44100)+A*sin(2*pi*1209*(0:N-1)/44100
如果我想为数字 1 生成拨号音,N 是我想要生成的长度,44100 是采样频率。
然后我想使用 FFT 来分析声音的频率并绘制FFT 输出。虽然我得到了我想要的正确频率,但幅度看起来不同,这让我很困惑。
所以发生了什么事?为什么两个幅度不同?
[temp,fs] = audioread('record.wav');
[P1,f] = fft_recorder(temp,fs);
function [P1,f] = fft_recorder(array,fs)
array = fft(array);
P2 = abs(array/length(array));
P1 = P2(1:length(array)/2+1);
P1(2:end-1) = 2*P1(2:end-1);
f = fs*(0:(length(array)/2))/length(array);
end
解决方案
输出声音的扬声器和您所在的房间(由于多路径反射和共振)很可能在该频率范围内没有平坦的频率响应。由于与扬声器或 iPhone 接触而产生的任何机械共振也会在不同频率下以不同的量改变接收到的音频电平。(iPhone 的麦克风可能更接近平坦的频率响应,但并不完美。)因此,即使将变量 A 设置为常数,某些频率也会被记录为比其他频率更强。
尝试在您想要的频率范围内一次测试一个频率,并测量您的通道的响应。当改变房间中扬声器、麦克风或其他大型物体的位置时,频率响应曲线甚至可能发生很大变化。
推荐阅读
- javascript - (Vanila JS DOM)为什么删除按钮不适用于所有“删除”类..?
- python - 如何显示此回归树?
- azure - 我可以将构建工件的 URL 传递给链接的 ARM 模板部署吗?
- python - 在方括号之间的初始子字符串之后提取文本
- python - 使用 export_inference_graph 时出错:TypeError: export_inference_graph() got an unexpected keyword argument 'use_side_inputs'
- sql - 如何使行使用已删除行的 rowid,其 rowid 低于它们?
- python - 在 Colab TPU 上使用分布式策略训练模型
- macos - 在两台 Mac 上设置密钥后,Mac 使用 SSH 询问密码
- r - 按其值转换表中的列
- sql - Oracle SQL:如何使用“IN 或 NOT IN 或其他”关键字检查给定的员工 ID 列表中不存在哪些记录?