我正在尝试将录制的声音转换为噪音,这样如果有人播放转换后的录音,就会发出噪音。然后,如果我对转换后的录音进行反向操作,即噪音,我应该恢复原来的声音。
这是我将录制的声音变成噪音的代码:
c = wavread('haseeb');
a = (c-min(c)) / (max(c)-min(c)); % normalization to bring the voice values in the range [0,1]
for i=1:length(a)
% speading the values into the range[-1,1]
if ((a(i,1)>=0) && (a(i,1)<=0.2))
b(i,1) = a(i,1)-1;
elseif ((a(i,1)>0.2) && (a(i,1)<=0.4))
b(i,1) =a(i,1)+0.6;
elseif ((a(i,1)>0.4) && (a(i,1)<=0.6))
b(i,1) = a(i,1)-0.5;
elseif((a(i,1)>0.6) && (a(i,1)<=0.8))
b(i,1) = a(i,1)-1.2;
elseif((a(i,1)>0.8)&&(a(i,1)<=1))
b(i,1)=a(i,1)-0.4;
else
end
end
此代码在某种程度上有效。录制的声音会转换为噪音,但您可以在背景中听到原始声音,如果播放的声音减慢,您可以听到声音。我想修改代码,这样它就会完全变成噪音,没有人可以听到声音,当我应用反向过程时,我会恢复原来的声音。
答案 0 :(得分:0)
一种可能的方法是使用随机正交变换矩阵
这个想法如下:
1.首先生成一个大小为N
的随机方阵。请注意,N
是窗口大小,而不是信号的长度
2.接下来,使用svd
构建随机正交变换
3.将信号分成长度为N
的段,并将每个段与变换相乘
4.要重建信号,只需将每个段与转置相乘即可
这可能不是你想要的最有效的方法,但它应该工作。
以下是使用MATLAB内置音频文件之一的此类过程示例:
load handel.mat
N = 256;
Frames = floor(numel(y)/N);
RandTrans = randn(N);
[U,S,V] = svd(RandTrans);
RandTransOrtho = U*V';
x = zeros(size(y));
yrec = x;
for k=1:Frames
x((k-1)*N + (1:N)) = RandTransOrtho*y((k-1)*N + (1:N));
yrec((k-1)*N + (1:N)) = RandTransOrtho'*x((k-1)*N + (1:N));
end