如何使用MATLAB控制播放哪个声道?

时间:2017-03-29 14:10:01

标签: matlab audio

我是新手MATLAB用户,如果问题非常基本,请道歉。我需要一个.wav声音文件在一个特定的频道播放 - 让我们说左声道。实际上,我的代码读入了声音文件,并添加了一列零来取消我不想要的频道,如下所示:

currentDir = pwd;
soundFile = [currentDir '\sound1.wav']; % load the file

[y, Fs] = audioread(soundFile); % read the file in

soundData(:,1) = y(:,1); % keeps sound for the left channel
soundData(:,2) = 0; % nullifies the right channel

sound = audioplayer(soundData,Fs); 
play(sound);

目前,代码当前产生的声音在左扬声器中为满音量,在右扬声器中产生一半音量(但仍然非常可听见)。我用至少20个.wav文件试过这个,结果相同。

如果它是相关的,即使我在0s中明确匹配声音变量长度的代码中也会发生这种情况,如下所示:

[y, Fs] = audioread(soundFile);
silentChannel = zeros(size(y));

soundData(:,1) = y(:,1); % keeps sound for the left channel
soundData(:,2) = silentChannel(:,2); % nullifies the right channel

有人知道我做错了什么,或者有什么想法?

3 个答案:

答案 0 :(得分:1)

在MatLab中,播放声音的预期方法是方法sound(data,Fs)

要控制声音发出的频道,您想知道sound()如何阅读data

data是一个矩阵,其中的列表示通道,并且行包含给定采样频率的波形样本Fs

这是一个简单的实现。

function treismanwolfe()
    close all
    clear all
    clc
    Fs = 40000;
    tau = 2*pi();
    t = 0:tau/(Fs-1):tau/2;
    left = sin(t).*(sin(t*200)+sin(t*1600));
    left= left/max(abs(left));
    left = left'; %turn column vector into row
    right = sin(t).*(sin(t*800)+sin(t*400));
    right= right/max(abs(right));
    right = right'; %turn column vector into row
    data = [left,right*0]; %multiply either by 0 to nullify
    sound(data,Fs); %so you can hear it.
end

我希望这适合你。享受!

答案 1 :(得分:1)

您的代码绝对正确,它只应在左声道播放音频。我怀疑这个问题是由声卡/驱动程序问题引起的。请允许我建议以下故障排除步骤:

  1. 使用audiowrite('output.wav', soundData, Fs)将输出保存为wav文件。使用其他音频播放器播放此内容,例如Audacity。如果您仍然听到两个频道的输出,则必须是声卡/驱动程序问题。
  2. 假设您使用的是Windows PC(按照文件路径中的语法),请确保禁用所有声音增强功能。如何做到这一点取决于PC。如果有第三方应用程序控制播放设置,您必须使用它。否则,请在控制面板中找到下图所示的设置。
  3. enter image description here

答案 2 :(得分:0)

当我运行你的代码时,音频输出只能在你指定的左声道中听到。

@Austin Kootz&#39;带声音的版本() - 功能同样好,也可以产生你想要的东西,但是使用audioplayer-object,你可以在播放过程中停止播放(你可能知道)< / p>

您是否尝试过将.wav转换为其他格式以查看是否会进行更改?