输出音频文件所需函数为 audiowrite 。通过例程进行解释:
% 生成时间序列 fs = 5000; % [Hz] 信号采样频率 T = 1; % [s] 信号长度 x = 0:1/fs:T; % [s] 时间序列 % 生成信号序列 f = 440; % [Hz] 信号频率 y = 1*sin(2*pi*f*x); % 输出音频文件 fname = 'Asin1.wav'; % 设定文件名称 注意格式 audiowrite(fname,y,fs); % 输出文件 % 音频文件测试 clear y Fs % 初始化工作区 [y,Fs] = audioread(fname); % 读取音频文件 sound(y,Fs); % 收听音频
这里,我们设定第八行的幅度为1,也就是说信号的最高幅值为1。当然,也可以尝试其他的数比如 0.5、0.7、1、2、5、10,都可以试着听一下。不难发现,幅值小于1时,得到的是单频正弦信号;但当幅值大于1时,会出现其他频率的声音。这并不是因为扬声器失真,个人猜测可能是因为 Matlab 对幅度的截止造成的。一些博客里给出的幅度调整方案感觉并不适用于 2015 版本的 Matlab。
利用 if else 语句对之前的信号进行幅度剪裁,只保留 [-1,1] 区间内的值,绘图如下:
下面通过听音实验验证上述猜想:
% 生成时间序列 fs = 12000; % [Hz] 信号采样频率 T = 1; % [s] 信号长度 x = 0:1/fs:T; % [s] 时间序列 % 生成信号序列 f = 440; % [Hz] 信号频率 A = [0.5 0.7 1 2 5 10]; % 设了6个信号幅度
y1 = zeros(6,length(x)); % 未截断信号初始化 for n = 1:6 y1(n,:) = A(n)*sin(2*pi*f*x); % 未截断信号赋值 end y2 = y1; % 截断信号初始化 for n = 1:6 for m = 1:length(x) % 截断信号赋值 if y1(n,m)>1 y2(n,m) = 1; else if y1(n,m)<-1 y2(n,m) = -1; end end end end % 测试控制 k = 5; % 选择第k组进行听音比较,k取1至6 y = [y1(k,:),y2(k,:)]; % 生成目标信号 % 输出音频文件 fname = 'Asin2.wav'; % 设定文件名称 注意格式 audiowrite(fname,y,fs); % 输出文件 % 音频文件测试 clear y Fs % 初始化工作区 [y,Fs] = audioread(fname); % 读取音频文件 sound(y,Fs); % 收听音频
以上是关于 audiowrite 函数的讨论。最后列出一些相关博文,以及其他有趣的博文:
来源: CSDN博客 作者:消防菊的博客 (关于纯音、和弦)
来源:Matlab (也可参原文档 help 或 doc)
END