查看: 1144|回复: 23|关注: 0

[已解决] 谱减法去噪

[复制链接]

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
老师您好,这个破碎声是还有噪声的信号,noise是噪声信号,我怎么更改程序才能实现将破碎声减去噪声得到纯净的声音信号,这两个声音采样频率和时间都一样,但读取出的数据点有差别。请求老师给我指导一下。

clear all;
clc;
close all;

[xx,fs]=audioread('C:\Users\张大少爷\Desktop\破碎声.wav');  % 读入数据文件
xx=xx-mean(xx);                         % 消除直流分量
x=xx/max(abs(xx));                      % 幅值归一化
noise=audioread('C:\Users\张大少爷\Desktop\noise.wav');%噪声
signal=Gnoisegen(x,SNR);                % 叠加噪声
snr1=SNR_singlech(x,signal);            % 计算叠加噪后的信噪比
N=length(x);                            % 信号长度
time=(0:N-1)/fs;                        % 设置时间
IS=.15;                                 % 设置IS

% 调用SSBoll79m_2函数做谱减
[output,voiceseg,vosl,SF,Ef]=SSBoll79m_2(signal,fs,IS,0.12);
ol=length(output);                      % 把output补到与x等长
if ol<N
    output=[output; zeros(N-ol,1)];
end
snr2=SNR_singlech(x,output);            % 计算谱减后的信噪比
snr=snr2-snr1;
fprintf('snr1=%5.4f   snr2=%5.4f   snr=%5.4f\n',snr1,snr2,snr);

wavplay(signal,fs);
pause(1)
wavplay(output,fs);
% 作图
subplot 311; plot(time,x,'k'); grid; axis tight;
title('纯语音波形'); ylabel('幅值')
subplot 312; plot(time,signal,'k'); grid; axis tight;
title(['带噪语音 信噪比=' num2str(SNR) 'dB']); ylabel('幅值')
subplot 313; plot(time,output,'k');grid; ylim([-1 1]);
title('谱减后波形'); ylabel('幅值'); xlabel('时间/s');


破碎声.zip

681.09 KB, 下载次数: 2

noise.zip

636.84 KB, 下载次数: 6

论坛优秀回答者

17

主题

5197

帖子

1128

最佳答案
  • 关注者: 639
发表于 2019-6-27 15:43:58 | 显示全部楼层 |此回复为最佳答案
用谱减法是有这样3个条件:1,用于带噪的语音信号;2,噪声是稳态的;3,信噪比不是太小。
LZ现在的信号不是语音信号,又噪声似乎也不是稳 态的,信噪比也不知道。
为什么一定要语音信号,因为语音信号有一个特点,对于相角是不敏感的,所以在谱减法中语音合成部分还是用了原始信号 的相角。
如果LZ也认为破碎声也对于相角是不敏感的,还想用谱减法,则建议用简单的谱减法simplesubspec函数,不要用改进的谱减法SSBoll79m_2函数,因为在该函数中用谱熵法进行了端点检测。而在破碎声中是否合适用这种方法, 是否需要端点检测? LZ是否知道,如果也是不清楚的话不如用简单的谱减法。

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
 楼主| 发表于 2019-6-27 16:55:45 | 显示全部楼层
宋老师您看这个代码对吗?有没有需要改的地方,怎么改能提高去噪效果,但不能使波形失真。
clear all;
clc;
close all;                  
x=audioread('C:\Users\张大少爷\Desktop\破碎声.wav');  % 读入数据文件
fs=44100
IS=0.25;
wlen=200;
inc=80;

N=length(x);
time=(0:N-1)/fs;
overlap=wlen-inc;
NIS=fix((IS*fs-wlen)/inc+1);
a=4;b=0.001;
output=simplesubspec(x,wlen,inc,NIS,a,b);
plot(time,output);

论坛优秀回答者

17

主题

5197

帖子

1128

最佳答案
  • 关注者: 639
发表于 2019-6-28 08:47:11 | 显示全部楼层
wuming123 发表于 2019-6-27 16:55
宋老师您看这个代码对吗?有没有需要改的地方,怎么改能提高去噪效果,但不能使波形失真。
clear all;
clc ...

我不了解这个破碎声,IS在语音中是前导无语音的长度,LZ应根据具体情况来设置;又LZ的声音不是语音,采样频率是44100,wlen和inc这两个参数可以大一些,而参数a不妨也改大一些,看是否能提高减噪的效果。

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
 楼主| 发表于 2019-6-28 10:03:13 | 显示全部楼层
老师好,这个声音是质构仪压碎食品的声音,我想去除质构仪工作的机器噪声,只提取样品破碎的声音

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
 楼主| 发表于 2019-7-2 13:03:46 | 显示全部楼层
1.老师那我可以采用什么方法进行去噪?2.老师我进行傅里叶变换后幅值和时域幅值为什么不同啊?相差好多,并且我变换后也乘了2/N
这是我的傅里叶变换程序:
clear all ;
close all;
clc
data=audioread('C:\Users\张大少爷\Desktop\破碎声.wav');  % 读入数据文件
X=length(data); %//1到921行的第一列
Y=data;
fs = 44100;   %采样频率和数据点数
N=X;
t=(0:N-1)/fs;   %时间序列
subplot(2,1,1),plot(t,Y);
y=fft(Y);    %对信号进行快速Fourier变换
mag=abs(y)*2/N;%求得Fourier变换后的振幅
n=0:N-1;
f=n*fs/N;    %频率序列
subplot(2,1,2),plot(f(1:N/2),mag(1:N/2));   %绘出随频率变化的振幅
xlabel('频率/Hz');
ylabel('振幅');grid on;
untitled.jpg

论坛优秀回答者

17

主题

5197

帖子

1128

最佳答案
  • 关注者: 639
发表于 2019-7-2 16:18:40 | 显示全部楼层
wuming123 发表于 2019-7-2 13:03
1.老师那我可以采用什么方法进行去噪?2.老师我进行傅里叶变换后幅值和时域幅值为什么不同啊?相差好多,并 ...

1,因为不熟悉破碎声,我没有什么好的方法。
2, 用乘了2/N来得到信号的幅值,这只适用于平稳的正弦信号。LZ的信号是脉冲信号,而通过傅里叶分解无法 用乘了2/N得到一个脉冲的幅值。

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
 楼主| 发表于 2019-7-7 21:41:53 | 显示全部楼层
谢谢亲爱的宋老师的解答,老师我想再问一下,因为试验中无法得到纯净的声音信号,所以我想用含噪音的有声段代替纯净的声音信号, 无声段作为噪音, 来估算初始信号的信噪比,对前导无话段噪声的平方求平均然后乘以总帧数来作为整个信号的噪声。SNR=10*log10(Ps^2/Pn^2)式中,Ps为原始声音信号; Pn为噪音信号 。
下面是我的程序想让老师帮我看看对不对
clear all;
clc;
close all;                  
x=audioread('C:\Users\张大少爷\Desktop\破碎声.wav');  % 读入数据文件
fs=44100;%采样频率
IS=1;%前导无话段长度s
wlen=600;%设置帧长ms
inc=300;%设置帧移ms
wnd=hamming(wlen);%窗函数
y=enframe(x,wnd,inc);%分帧求帧数
fn=size(y,2);
NIS=fix((IS*fs-wlen)/inc+1);%前导无话段帧数
ya=y.^2;%信号平方
s=mean(ya(:,1:NIS),2);
r=fn*sum(s);%噪声信号平方
snr1=10*log10(sum(x.^2)/r);%去噪前信噪比


破碎声.zip

681.09 KB, 下载次数: 1

论坛优秀回答者

17

主题

5197

帖子

1128

最佳答案
  • 关注者: 639
发表于 2019-7-8 15:13:09 | 显示全部楼层
本帖最后由 songzy41 于 2019-7-8 15:14 编辑
wuming123 发表于 2019-7-7 21:41
谢谢亲爱的宋老师的解答,老师我想再问一下,因为试验中无法得到纯净的声音信号,所以我想用含噪音的有声段 ...

最近偶然的机会处理了一些离散的脉冲信号,我发现有一定带宽的脉冲信号主要成份在低频。我同时也发现LZ的破碎声信号也类似于脉冲信号,我对LZ提供的破碎声做了谱分析,得到类似于LZ在6层得到的谱图,但我用分贝表示,显示在下图第2张图中。可以看出在400HZ之后有好多周期性信号的峰值,我认为这是由机械在旋转时产生的,而破碎声的能量主要集中在低频。所以
1,设计了FIR低通滤波器,参数有fp=300,fs=400,用Blackman窗函数,Ap=3,As=60。滤波后的输出在下图第1幅图中(图中上半幅是原始数据,下半幅是低通活性种反的输出数据)。
2,在低通滤波器输出的基础上再进行谱减法。
LZ提到的信噪比计算的方法法总不是实际的信噪比,LZ终究没有实际单独的信号和噪声。
wn12a.jpg
wn012b.jpg

新手

7 麦片

财富积分


050


17

主题

52

帖子

0

最佳答案
 楼主| 发表于 2019-7-9 11:34:19 | 显示全部楼层
老师好,谢谢老师无私的指导与帮助,老师我本科学的是机械设计制造及其自动化,研究生读了机械电子涉及到信号处理这部分内容,因为没有基础所以问了老师很多问题,真的打心眼里感激老师,谢谢老师对我的帮助。真的感谢您。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表