MATLAB - 组合不同长度和采样的.wav文件

时间:2014-05-12 22:17:42

标签: matlab audio signal-processing delay octave

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

编辑12/29 AM 5/13/14 在与合作伙伴讨论目标和设备后,我现在更清楚地知道需要发生什么,现在需要找出如何解决这些空白。延迟最多可能需要在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录音上,我将非常感激。

2 个答案:

答案 0 :(得分:2)

这是一个如何运作的例子。我通过将延迟限制为采样周期的倍数来简化问题。对于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;

答案 1 :(得分:1)

几点:

除非我的数学错误(完全可能),否则典型的44 kHz音频采样率无法检测到10到300 ns的延迟。您需要处于MHz采样率范围内。

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

为了增加噪音,您可以使用randn并根据您的失真程度进行缩放。我建议修补你乘以它的价值。或者,您可以使用awgn添加白高斯噪声。我确定有办法在傅立叶或时域中添加其他类型的噪音,但您可以查看这些噪音。

如果您想在延迟期间发出噪音,请切换两者的顺序。

提醒您,您可以使用声音(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');