【问题标题】:MATLAB - Combining .wav files of different length and samplingMATLAB - 组合不同长度和采样的 .wav 文件
【发布时间】:2014-05-12 22:17:42
【问题描述】:

这是我第一次在此类项目中使用 Octave/MATLAB。我对信号处理也完全陌生,所以请原谅我缺乏知识。该项目的最终目标是创建一个 mfile,该文件将能够获取将从麦克风录制的 wav 文件,为其添加噪声失真级别,该级别将由用户以增量方式指定,并且还添加对于将要生成的新 wav 文件,音频的右声道或左声道的可变起始延迟。

2014 年 5 月 13 日凌晨 12:29 编辑 在与合作伙伴讨论目标和设备之后,我对现在需要做什么有了更清晰的想法,现在需要找出如何解决这些空白。延迟很可能必须在最大 10 到 300 ns 之间,噪声强度应该在 0 到 5 之间,范围从无声到重度静态。

clear;
delay=input('Delay in ns: '); 
noise=input('Level of distortion: ); 
[y,Fs,nbits]=wavread(filename); 

generate some noise same length and sampling as file 

[newy,Fs]=[y+y2,Fs]; 

shift over wave x many nanoseconds 

wavwrite(newy,Fs,'newwave');

对于当前合并信号目标的任何帮助,或者如果您可以帮助生成噪声以覆盖到任何大小的 .wav 录音上,我将不胜感激。

【问题讨论】:

  • 关于您的要求的几个问题。 1)两个文件的采样率是否相同?如果不是,您将需要更困难的采样率转换。 2)延迟是否只需要采样间隔准确? 3) 假设 2 个输入文件是单声道的,因为它们来自麦克风,你是在混音到立体声,其中文件 1 到左声道,另一个到右声道,还是到另一个单声道文件或其他?
  • 1) 两个文件的采样率不同。我现在可以看到实现混合它们可能会更加困难。我想我想从生成与给出的任何输入相同长度和样本的失真开始,以便可以以更简单的方式添加它。 2)延迟必须是实时准确的,特别是纳秒,但这只是几秒的倍数,所以希望它不会太难。 3)我和我的搭档计划使用的录音设备通过RCA连接器具有左右输入和左右输出,因此应该是立体声的。
  • 那么 file1 信号是否需要进入 1 个输出通道,然后 file2 进入另一个,或者信号是否混合以便组合信号进入两个输出通道?我问的原因是,如果它们像前者那样分开,那么两个输入信号就不需要相互混合。另一方面,如果确实需要混合它们,那么您的首要任务就是将采样率转换为其中一个以匹配另一个。我很好奇为什么它们会以不同的速率运行,因为您的输入是模拟的,并且您可以控制 A/D 转换的速率。
  • 让我快速地用伪 matlab 代码重写我想要做的事情,这样更容易看到。我将在早上编辑顶部以更好地反映这一点。再次感谢jaket的兴趣! delay=input('ns 中的延迟:');噪声=输入('失真程度:); [y,Fs,nbits]=wavread(文件名); 产生一些与文件相同长度和采样的噪声 newwave=[y+y2,Fs]; 在 x 波上移动许多纳秒 wavwrite(newwave);很抱歉起初令人困惑的目标。这两个文件系统是为了学习目的来组合信号,但最终新的文件系统应该是相同的长度和样本。

标签: matlab audio signal-processing delay octave


【解决方案1】:

这是一个如何工作的示例。我通过将延迟限制为采样周期的倍数来简化问题。对于 48kHz 的采样率,延迟分辨率约为 20us。此方法首先将延迟转换为多个样本,并将其添加到波形文件中的样本中。其次,生成相同长度的噪声信号,然后将其逐个元素添加到第一个信号中。

noiseLevel = input('Level of distortion: '); % between 0 and 1 - 0 means all signal
                                                               - 1 means all noise
delaySeconds = input('Delay in seconds: ');  % in seconds
[y,fs,nbits] = wavread(filename);

% figure out how many samples to delay. Resolution is 1/fs.
delaySamples = round(delaySeconds * fs);

% signal length
signalLength = length(y) + delaySamples;

% generate noise samples
noiseSignal = gennoise(signalLength); % call your noise generation function.

% prepend zeros to the signal to delay.
delayedSignal = vertcat(zeros(delaySamples,1), y);

combinedSignal = noiseLevel*noiseSignal + (1-noiseLevel)*delayedSignal;

【讨论】:

  • 非常感谢jaket!我用我拥有的一些样本测试了它的修改版本,我对结果非常满意。绝对清除了很多如何做到这一点。
【解决方案2】:

几点:

除非我做错了数学运算(完全有可能),否则 10 到 300 ns 的延迟在典型的 44 kHz 音频采样率下是无法检测到的。您需要在 MHz 采样率范围内。

此解决方案假定您的信号是一个通道(单声道)。使用这种格式实现更多通道应该不会太难。

要添加噪声,您可以使用 randn 并根据您的失真程度对其进行缩放。我建议修改你乘以它的值。或者,您可以使用 awgn 添加高斯白噪声。我确信有办法在傅里叶或时域中添加其他类型的噪声,但你可以研究一下。

如果你想要延迟期间的噪音,请切换两者的顺序。

提醒您可以使用 sound(newy,Fs) 来查看您是否喜欢您的结果。

clear;
delay=input('Delay in ns: '); 
noise=input('Level of distortion: ); 
[y,Fs,nbits]=wavread(filename); 

% Add random noise to signal
newy = y + noise*0.1*randn(length(y),1);

% shift over wave x many nanoseconds 
num = round(delay*1e-9*Fs); % Convert to number of zeros to add to front of data
newy = [zeros(num,1); newy]; % Pad with zeros

wavwrite(newy,Fs,'newwave');

【讨论】:

  • 感谢您的回答!它肯定有助于修复我的原始代码,并让我知道如何添加噪音!谢谢user3631114!
猜你喜欢
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2021-11-12
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
相关资源
最近更新 更多