在matlab中创建二维数组以在左右声道中播放音频

信息处理 matlab 信号分析 声音
2022-01-29 08:53:18

我是 matlab 声音处理的新手,我正在尝试为下面的声音代码创建一个二维数组。我必须让声音在 20hz 有 400 个样本(即 10 毫秒),但无法让代码正常工作。任何帮助将不胜感激。步骤为: (1)构造一个二维数组(n×2数组,即2列n行,n为每个声道的样本数)。该数组是声音信号,第一列是左声道(左扬声器)的声音,第二列是右声道(右扬声器)的声音 (2) 然后播放声音。

Fs = 44100;
t = [0:4/Fs:4-4/Fs];
freq = 20;
f1 = sin(2*pi*freq*t);
f2 = sin(2*pi*2*freq*t);
%Sound 1
sound(f1,Fs);
%Sound 2
sound(f2,Fs);
%Play Consecutive
f12 = [f1 f2];
sound(f12,Fs);
%Play together
f_12 = [f1+f2];
sound(f_12,Fs);
2个回答

由于我的扬声器有点难以听到 20 Hz,因此我将主频率更改为 600 Hz。我想它应该工作:

clc;
clear all;

Fs = 44100; 
N = 40000; % sample size
t = (1:N)*(1/Fs); 
freq = 600; 

sound_array = zeros(N, 2); % initializes a N x 2 matrix
sound_array(:,1) = sin(2*pi*freq*t); 
sound_array(:,2) = sin(2*pi*2*freq*t); 

% Sound 1 
sound(sound_array(:,1),Fs); 

% Sound 2 
sound(sound_array(:,2),Fs); 

% Play the first column at left channel and the second column at the right
% channel
sound(sound_array,Fs);

实际上,如果您在 中使用整个数组作为输入sound,则第一列将进入左通道,第二列将进入右通道。

我将从构建向量t开始。作业说要生成一个长度为 400 个样本的信号。但是,由于您构建t的方式,您的信号的长度为 44100 个样本。在我建议生成信号的方式中,我们需要一个向量,其中包含我们的信号最终将具有的样本的索引,所以

t = (0:399)';

这给了我们一个大小为 400x1 的列向量(因为我使用了转置运算符'),其中包含我们的信号样本的索引。

现在你的任务是生成一个频率为 20 Hz 的信号并让它运行 400 个样本。我认为这有点奇怪,因为该频率的信号仅在 400 个样本中并没有完成一个完整的周期,采样率为 44100 赫兹。无论如何,我们将按照您的任务要求继续。

我们现在必须将 20 赫兹的频率转换为取决于Fs的角频率。为此,我们使用以下代码:

w = 2*pi*(f/Fs);

f = 20;. t一起,w现在将成为我们sin()生成信号的函数的输入。现在这很简单:

f1 = sin(w*t);

练习的下一部分似乎是将我们刚刚创建的两个单声道信号组合成一个立体声信号。

(1)构造一个二维数组(nx 2数组,即2列n行,n为每个声道的样本数)。

要做到这一点,您应该研究向量(或矩阵)在 MATLAB 中是如何连接的。由于f1f2是列向量,要将它们组合成一个大小为 400x2 的矩阵,我们可以使用

F12 = [f1 f2];

如果我们想连接它们,就像您在代码中所做的那样,我们将不得不使用

F12 = [f1; f2];

为了播放这些信号,我建议使用soundsc(),它会在播放前对音频进行标准化(因此在高振幅的情况下不会损坏您的扬声器):

soundsc(F12, Fs);