谱减法的Matlab程序
谱减法原理及其实现过程

学校代码: 10128学号:语音信号处理专题报告(题目:谱减法原理及其实现过程学院:专业:学生姓名:学号:班级:二〇一二年六月谱减法原理及其实现过程摘要本文主要研究谱减法原理及其实现过程及了解其在语音增强中的应用,目的是增强语音质量,减少语音失真和提高其可懂度。
S. Boll 假设噪声是平稳的或缓慢变化的加性噪声,并且语音信号和噪声信号不相关的情况下,提出了谱减法(SS:Spectral Subtraction)。
该方法能够抑制背景噪声的影响,但由于其局部平稳性的假设与实际情况并不相符,因此效果不理想,残留的音乐噪声较大;Berouti在传统谱减法的基础上增加了调节噪声功率谱大小的系数和增强语音功率谱的最小值限制,提高了谱减法的性能,但是其修正系数和最小值是根据经验确定的,适应性较差;P. Lockwood在谱减法的基础上提出了非线性谱减法(NSS:Non-liner Spectral Subtraction),它根据语音信号的信噪比自适应调节语音增强的增益函数,提高了语音的信噪比,而信噪比并不能正确反映信号的听觉质量,因此用信噪比作为调整估计参数的依据并不能提高信号的听觉质量;Boh Lim Sim等人也提出了与此相近的改进算法,虽然提高了信号的信噪比,但残留的音乐噪声较大;Virag将人耳的掩蔽特性应用到非线性谱减法的增强算法中,部分解决了谱减法残留音乐噪声大的问题,但在信噪比较低或非平稳的情况下,其增强效果不理想;I.Cohen 等人首先估计语音信号概率密度函数,然后在此基础上改进了对数谱估计算法,使得改进的算法对非平稳噪声具有良好的抑制作用,该算法的缺点是语音信号的概率密度函数较难估计。
噪声参数估计的准确与否直接会影响谱减法语音增强效果,因此,带噪语音中背景噪声参数的估计问题值得关注。
最后,基于噪声与语音具有一定的相关性的实际情况,我们提出了算法的进一步改进设想,并对此思想做出了数学推导,得到了算法进一步改进的方向及可行性。
c语言的谱减法实现(Implementation of spectral subtraction in C)

c语言的谱减法实现(Implementation of spectral subtraction inC)The realization of.Txt18 spectral subtraction with honest C language, abandon the false; with honesty, to abandon the boring; with ease to abandon the impetuous, whether intentionally discarded, or accidental loss, as long as ever have, in some cases, generous abandon is also a kind of realm.C language to achieve spectral subtraction.Txt12 missing is a poem to let you in ordinary days to read out the rhythm; missing is a shower, let you dry up the moist days; missing is a sun, so that your days of gloomy clear up. #include <stdio.h>#include <stdlib.h>#include <math.h>#define WL 256 / / window length#define P 10 / / prediction coefficient#undef pi#define PI 3.1415926535897932384626434#define PI 3.1415926#define winsize 256#define tempsize winsize/2#define buffsize winsize*10 Typedef struct{Double real;Double img;}complex;Unsigned int f=0;Unsigned int c=0;Complex noise[winsize]; Double buff_r[buffsize]; Double buff_w[buffsize]; Double temp[tempsize]; Complex x[winsize]; Complex y[winsize];Int hr=0;Complex W[winsize]; Complex W1[winsize];Double x_abs[winsize];Double y_abs[winsize];Double noise_abs[winsize];Void FFT (complex *x, int size_x, complex *W); / * * / fast Fourier transformVoid IFFT (complex, *x, int, size_x, complex, *W1);Double angle (complex a); / /Void add (complex, complex, complex *); / * * / complex additionVoid mul (complex, complex, complex *); / * * / complex multiplicationVoid sub (complex, complex, complex *); / * * / plural subtractionVoid change (complex *x, int size_x); / * * / array transposeDouble abs1 (complex a);Void Hamming (complex hw[]);/*int ReadWaveFile (char, *fn, int, *fs, short, **dat);Int ReadWaveFile (...Char *fn / / I: file nameInt *fs / / O: file sizeShort **dat / / O: voice data){FILE *fp;Int dsize;If ((FP = fopen (FN, rb+)) = = NULL) {Fprintf (stderr,%s:, No, file, \n, such, FN); return (-1);}Fseek (FP, 0L, SEEK_END);Dsize = fTell (FP) /2;Fseek (FP, 0L, SEEK_SET);(if (*dat = (short * malloc) (sizeof (short) *dsize)) = = NULL) {Fprintf (stderr, Memory, \n, Error); return (-1);}If (FREAD (*dat, sizeof (short), dsize, FP) = = (unsigned, int) dsize) {Free (*dat);Return (-1);}Fclose (FP);*fs = dsize;Return (0);}*/Void Hamming (complex hw[]){Double x;Int i;For (i=0; i<WL; i++){Double cos (x);X=2*pi*i/ (WL-1);Hw[i].real=hw[i].real* (0.54-0.46*cos (x)); //*32768;}}Void, FFT (complex, *x, int, size_x, complex, *W) {Int, i=0, j=0, k=0, l=0, jk=0;Complex, up, down, product;Change (x, size_x);For (i=0; i<log (size_x) /log (2); i++) {/ * a butterfly.L=1<<i;For (j=0; j<size_x j+=; 2*l) {/ * * / a group of butterfly operationFor (k=0; k<l; k++) {/ * * / a butterflyJk=j+k;Mul (x[jk+l], W[size_x*k/2/l], &product);Up.real=x[jk].real+product.real;Up.img=x[jk].img+product.img;Down.real=x[jk].real-product.real;Down.img=x[jk].img-product.img;X[jk]=up;X[jk+l]=down;}}}}* index calculation, X (n) code bit inversion. Void change (complex, *x, int, size_x) { Complex temp;无符号短i=0,j=0,k=0;双T;为(i = 0;i < size_x;i++){k = i;j=0;T =(log(size_x)/日志(2));当((t -)> 0){J=1;J | =(K 1);k=k > 1;}如果(j i){温度[ x ];[我];x =温度;}}}无效的IFFT(复杂* x,int size_x,复杂* W1){int i=0,j=0,k=0,l=0,JK=0;复杂的上、下、产品;改变(x,size_x);为(i = 0;i <日志(size_x)/日志(2);i++)/ * * /一级蝶形运算{l = 1 < <我;为(J = 0;J < size_x;J = 2 * L)/ * * /一组蝶形运算{为(k = 0;K<L;K +){ /*一个蝶形运算*/JK = k;穆尔(x [ JK + L],W1 [ size_x * K/2/L ],及产品);起来。
matlab '运算 -回复

matlab '运算-回复Matlab是一种高级计算机语言和环境,被广泛应用于科学和工程领域。
Matlab通过简洁而强大的语法,使人们能够进行各种数学和统计运算、数据分析、图形绘制以及模拟和建模等工作。
在Matlab中,运算是常见的操作之一,它能够执行诸如加法、减法、乘法、除法、取余数和指数等基本算术运算,以及更高级的矩阵运算和数值求解等复杂操作。
本文将以运算为主题,一步一步回答与Matlab运算相关的问题。
首先,我们将探讨Matlab中的基本算术运算。
在Matlab中,可以使用加号(+)来执行加法运算,使用减号(-)来执行减法运算,使用乘号(*)来执行乘法运算,使用除号(/)来执行除法运算。
此外,还可以使用取余数运算符(mod)来获取除法的余数,使用幂运算符(^)来执行指数运算。
例如,假设我们要计算2加3的结果。
在Matlab中,可以使用如下代码:result = 2 + 3;disp(result);在上述代码中,我们定义了一个变量result,并将2加3的结果赋值给它。
然后,我们使用disp函数来显示result的值。
执行以上代码后,Matlab 会将结果5显示在命令行窗口中。
同样地,我们可以使用减法运算符来执行减法运算。
例如,计算5减2的结果可以使用以下代码:result = 5 - 2;disp(result);在上述代码中,我们定义了一个变量result,并将5减去2的结果赋值给它。
执行以上代码后,Matlab会将结果3显示在命令行窗口中。
类似地,我们可以使用乘法运算符来执行乘法运算。
例如,计算4乘以3的结果可以使用以下代码:result = 4 * 3;disp(result);再次,我们定义了一个变量result,并将4乘以3的结果赋值给它。
执行以上代码后,Matlab会将结果12显示在命令行窗口中。
除法运算是另一个基本的算术运算。
与其他运算符一样,除法运算符(/)也可以用于在Matlab中执行除法运算。
matlab减法运算程序

matlab减法运算程序MATLAB是一种广泛使用的数字计算工具,它能够帮助我们完成各种各样的数学运算,包括加、减、乘、除等。
在MATLAB中,减法运算是一项常见的操作,通过它我们可以计算两个数之间的差值。
下面,我们就一起来看一看如何在MATLAB中进行减法运算。
减法运算的基本原理就是将减数从被减数中减去,然后得到差值。
在MATLAB中,可以使用减法符号“-”来执行减法运算。
如果需要计算多个数之间的差值,可以使用更多的减号进行操作。
例如,如果我们需要计算a、b、c三个数之间的差值,可以使用以下公式:a-b-c。
除了基本的减法运算,MATLAB还提供了许多其他的减法函数,例如subtract、minus等。
这些函数可以更加灵活地进行减法运算,并且可以应对不同的数据类型和数据结构。
下面,我们来看一下如何在MATLAB中编写一个简单的减法运算程序。
首先,我们需要定义两个数,例如:a = 10;b = 5;然后,我们可以使用减法符号进行减法运算:c = a - b;这样,c的值就会变成5,即a和b的差值。
如果我们想要计算多个数之间的差值,可以使用更多的减号将它们连接起来。
例如:d = a - b - 3;这个操作中,我们先将b从a中减去,得到5,然后再将3从结果中减去,最终的结果为2。
最后,需要注意的是,在进行减法运算的时候,需要注意数值的范围和精度问题,避免出现不必要的错误。
同时,需要根据具体的数据类型和数据结构选择合适的减法函数,确保程序的正确性和高效性。
以上就是关于MATLAB减法运算的相关内容介绍,希望对大家有所帮助。
matlab谱减法

matlab谱减法
在MATLAB 中,可以使用`spec减法`函数进行谱减法。
下面是一个简单的示例代码:
```matlab
% 产生两个信号
s1 = sin(2*pi*50*t);
s2 = sin(2*pi*150*t);
% 计算谱减法
c = spec减法(s1,s2);
% 绘制结果
plot(c);
```
在上述代码中,`spec减法`函数接受两个信号`s1`和`s2`作为输入,并返回它们的谱减法结果。
最后,使用`plot`函数绘制结果。
请注意,`spec减法`函数是基于离散傅里叶变换(DFT)的谱减法实现。
它假设输入信号在时间上是离散的,并且已经进行了DFT 变换。
如果需要对连续时间信号进行谱减法,可以先对信号进行采样和DFT 变换,然后再应用`spec减法`函数。
此外,谱减法的结果可能受到频谱泄漏和栅栏效应的影响。
在实际应用中,可能需要进行适当的加窗处理和频率分辨率的选择,以减少这些影响。
谱相减MATLAB代码以及信噪比计算

谱相减MATLAB代码以及信噪比计算实验二语音信号的频域处理一、实验目的、要求(1)掌握语音信号频域分析方法(2)了解语音信号频域的特点(3)了解谱减法作为频域语音增强的原理与编程实现(3)了解谱减法的缺点,并分析产生该缺点的原因二、实验原理语音虽然是一个时变、非平稳的随机过程。
但在短时间内可近似看作是平稳的。
因此如果能从带噪语音的短时谱中估计出“纯净”语音的短时谱,即可达到语音增强的目的。
由于噪声也是随机过程,因此这种估计只能建立在统计模型基础上。
利用人耳感知对语音频谱分量的相位不敏感的特性,这类语音增强算法主要针对短时谱的幅度估计。
短时话幅度估计概述设一帧加窗后的带噪语音为()()()01y n s n d n n N =+≤≤- (2.1)其中()s n 为纯净语音,()d n 假设为平稳加性高斯噪声。
将()y n 在一组基{()}k n φ上展开,使展对系数为各不相关的随机变量。
设()y n 的相关函数为(,)y R n m ,由K -L 展开得知{()}k n φ满足1()()(,)()N k y k m K n R n m m λφφ-==∑ (2.2)则()y n 的展开式为110()()()()N k k K N k k n y n Y nY y n n φφ-=-=?==??∑∑ (2.3) 如果()y n 的相关长度小于帧长N ,则()k n φ的近似函数为2()k nk n j N π=(2.4)可见()y n 的展开过程实际上相当于离散博里叶交换,其展开系数(为傅里叶变换系数。
由()()()y n s n d n =+,则有:k k k Y S N =+。
其中[]||exp k k k Y Y j θ=、[]||exp k k k S S j α=、k N 分别为()y n 、()s n 及()d n 的傅里叶交换系数。
由于假设噪声是高斯分布的,其傅里叶系数k N 相当于多个高斯样本的加权和,故可认为仍然为高斯分布。
谱减法的Matlab程序

谱减法的Matlab 程序:clear;[xx,fs]=wavread('I:\aa\0a.wav');[team,row]=size(xx);% 读语音信号if row==2 x=(xx(:,1)+xx(:,2))/2; yy=x;else% 将多通道求平均值x=xx;yy=x;endx=x-mean(x)+0.1*rand(length(x),1); N=length(x);n=220;n1=160;frame=floor((N-n)/(n-n1));for i=1:frame % 去直流分量并加噪% 每一帧长% 每两帧重合的长度% 帧数y1=x((i-1)*(n-n1)+1:(i-1)*(n-n1)+n).*hamming(n); % 每一帧对应的语音信号fy=fft(y1,n);%求fft nen( i,:)=abs(fy).A2; % 求能量ang(i,:)=angle(fy); % 求角度endyuzhi=sum(sum(nen(2:5,:)))/(4*n); for i=1:frame nen(i,:)=nen(i,:)-yuzhi;nen(i,find(nen(i,:)<0))=0;endfor i=1:frame% 求阈值,信号开始阶段的能量平均值% 减谱% 将小于0 的部分赋值为0nen(i,:)=sqrt(nen(i,:));jie=nen(i,:).*exp(j*ang(i,:)); % 求频域函数out(i,:)=real(ifft(jie))./hamming(n)'; %求逆fftendzong=out(1,:)';jiewei=n;% 对out 求导,以便于原信号比较for i=2:frame %将一系列的帧组合还原zong(jiewei-n1+1:jiewei)=(zong(jiewei-n1+1:jiewei)+out(i,1:n1)')/2;jiewei=jiewei+n-n1;zong=[zong;out(i,n1+1:end)'];endfigure(1);subplot(211);plot(x); %画加噪的原始语音信号axis([1,(n-n1)*frame+n,min(x),max(x)]);subplot(212);specgram(x,fs,1024,n,n1); % 对应的鱼谱图figure(2);subplot(211);plot(zong); %画增强的语音信号axis([1,(n-n1)*frame+n,min(zong),max(zong)]); subplot(212);specgram(zong,fs,1024,n,n1);wavplay(x,fs); % 输出音频wavplay(zong,fs);。
基于MATLAB的谱相减语音增强算法的设计与实现.

基于MATLAB的谱相减语音增强算法的设计与实现全部作者:汤维维第1作者单位:武汉理工大学论文摘要:谱减法是消除噪声的经典算法,它是处理宽带噪声的最通用技术,即从带噪语音估值中减去噪声频谱估值,而得到纯净语音的频谱。
本文基于MATLAB对谱减法算法进行设计和实现,并对传统谱减法和改进形式的谱减法进行比较。
仿真表明,改进形式的谱减法可以有效地降低背景噪声,提高信噪比。
关键词:语音增强;传统谱减法;改进形式的谱减法; MATLAB (浏览全文)发表日期:2006年05月11日同行评议:本文研究并在MATLAB平台上实现了1个简单的基于MATLAB的谱相减语音增强算法,研究方案比较合理,数据看起来也比较可靠,参考文献应用也比较恰当。
但没有提出新的想法,只是实现并验证了已有的方法,并做了1些小的改动,因此学术价值1般。
书写的文字有些语句不够通顺,英文摘要书写问题更多。
例如:对采样点补足帧的整数倍是(为了)方便实现MATLAB的矩阵计算以及最后对帧叠加进行还原处理。
This paper designs and realizes the algorithms of spectral subtraction based on MATLAB, and compare (应该是compares吧?)the improved form of spectral subtraction with the traditional spectral subtraction.It shows that the improved form of spectral subtraction and (and是多余的吧?) can efficiently decrease background noise and increase the SNR.综合评价:修改稿:注:同行评议是由特聘的同行专家给出的评审意见,综合评价是综合专家对论文各要素的评议得出的数值,以1至5颗星显示。
基于减谱法的信号处理研究_MATLAB软件辅助设计

afftxc2=(1+sign(afftxc2))*0.5.*afftxc2; afftxc=sqrt(afftxc2); fftxcr=afftxc.*cos(pffty); fftxci=afftxc.*sin(pffty); fftxc=complex(fftxcr,fftxci); xc=ifft(fftxc);
目前国内外的解决方法大体分为三类. 一类是采用语音增强算法等, 提高语音识别系统前端预处理的 抗噪声能力, 提高输入信号的信噪比. 第二类方法是寻找稳健的耐噪声的语音特征参数. 第三类方法是基于 模型参数适应化的噪声补偿算法. 本课题研究的就是前面提到的第一类方法——通过语音增强技术来改善 语音质量. 常用的语音增强技术有: 滤波法、自相关抗噪法、非线性处理法、Weiner 滤波法和减谱法.
己编写 FFT 程序, 所以在本课题设计的时候, 把重点放在 FFT 的用法而不是算法. 结合 MATLAB 强大的
信号处理能力, 完全可以达到较复杂的语音信号处理要求.
1.3 MATLAB 在语音信号处理中的实例
在本课题学习和实践中, 自始至终使用 MATLAB 阐述问题和进行计算, 比如上面原理部分涉及的傅
际应用问题. 使用 MATLAB 就很好的解决了这个问题.
MATLAB 是由 Mathworks 公司开发的国际公认的信号处理的标准软件和开发平台. 把语音信号处理
和 MATLAB 语言相结合, 调用已经标准化的模块, 比如, 以前在进行快速傅里叶变换的时候, 要进行很
复杂的计算, 目前在所有科学计算软件和数字信号处理芯片中, FFT 已经是标准模块, 一般都没有必要自
2000
3000
4000
7000
8000
matlab字符串的加减法

matlab字符串的加减法
在MATLAB中,字符串的加法和减法操作并不是直接的数学运算,而是用于连接字符串或者从字符串中移除指定的子字符串。
字符串的加法可以使用加号"+"来实现,例如:
matlab.
str1 = 'Hello, ';
str2 = 'world!';
result = str1 + str2;
disp(result);
这将输出,Hello, world!
字符串的减法则是通过使用replace函数来实现,例如:
matlab.
str = 'Hello, world!';
newStr = replace(str, 'Hello, ', '');
disp(newStr);
这将输出,world!
需要注意的是,在MATLAB R2016b及更高版本中,可以直接使用加号"+"来连接字符串,而在早期版本中可能需要使用函数strcat或者sprintf来实现字符串的连接操作。
对于字符串的减法操作,可以使用函数erase来移除指定的子字符串。
总之,MATLAB中的字符串加减法操作实际上是字符串的连接和移除操作,而不是数学上的加法和减法运算。
9种谱校正方法及matlab代码

9种谱校正方法及matlab 程序代码采样间隔归一化成1T ∆=,采样长度为N .这样FFT 离散谱线为0,1)i X i N =-(,相应的频率分辨率2/(1/)N f N ωπ∆=∆=. 设FFT 离散谱线局部极高谱线为m (为了数学上简洁,假定从0开始,注意在MATLAB 环境下数组实际操作的是从1开始),记频偏量δωδω=∆. 我们需要使用谱线m 和与之相邻一条次高谱线,记这连续两条谱线中左边一条序号为M (当次高谱线在m 左侧时1M m =-,反之M m =).下面列出若干算法的δ计算公式1. 加矩形窗的精确谱校正[1]i i i X U jV =+111()sin()()cos()M M M M opt M MV V M U U M K U U ωω+++-∆+-∆=- 1211cos()sin()cos()sin()opt M M opt M M K M Z V U M K M Z V U M ωωωωωω++-∆⎡⎤=+⎢⎥∆⎣⎦-∆+∆⎡⎤=+⎢⎥∆+∆⎣⎦ 2121cos()cos()()Z M Z M M m Z Z ωωωδ∆+∆-∆=+-- 2. 加矩形窗情形,采用解析单频模型的幅值比校正[1, 2]11||()||||M M M X M m X X δ++=+-+ 3. 加汉宁窗情形,采用解析单频模型的幅值比校正[1, 2]112||||()||||M M M M X X M m X X δ++-=+-+ 4. 加矩形窗情形,采用解析单频模型的复比值校正[3]11Re ()M M M X M m X X δ++⎛⎫=+- ⎪-⎝⎭5. 加汉宁窗情形,采用解析单频模型的复比值校正[3]112()M M M MX X M m X X δ+++=+-- 6. 加矩形窗情形,采用解析单频模型的复合复比值校正[3]11Re ()M m M M X M m X X δ++⎛⎫=+- ⎪-⎝⎭ 11m R m mX X X δ++=-,1111m m L m m m m X X X X X X δ---=-=-- 0.5)0.5)m L m R δδδδδ=-++((7. 加汉宁窗情形,采用解析单频模型的复合复比值校正[3]112Re ()M M m M M X X M m X X δ++⎛⎫+=+-⎪-⎝⎭ 112m m R m mX X X X δ+++=-,1111221m m m m L m m m m X X X X X X X X δ----++=-=-- 0.5)0.5)m L m R δδδδδ=-++((8. 加矩形窗,Quin 校正[4]11Re()Re(),Re()Re()m m L R m m X X X X αα-+== 11L R L R L Rααδδαα==---,, 00 R R L R δδδδδ>>⎧=⎨⎩当且其它9. 加汉宁窗,Quin 校正[4]11Re()Re(),Re()Re()m m L R m m X X X X αα-+== 212111L RL R L Rααδδαα++==---,,00 R R L R δδδδδ>>⎧=⎨⎩当且其它References1. Schoukens, J., R. Pintelon,H. Van Hamme. The interpolated fast Fourier transform: Acomparative study . IEEE Transactions on Instrumentation and Measurement. 1992, 41(2):226-232.2. 谢明,丁康. 频谱分析的校正方法.振动工程学报. 1994, 7(2): 172-179.3. 陈奎孚, 王建立,张森文. 频谱校正的复比值法.振动工程学报(已投). 2007.4. Quinn, B.G. Estimating frequency by interpolation using Fourier coefficients.IEEETransactions on Signal Processing. 1994, 42(5): 1264-1268.%========================这是调用调试==================DT=1;N=1024;PHI=pi/3;Ampl=1;CiR=11.9; %cycles in recordFreq=CiR/(DT*N); %frequencyTV=[0:N-1];DatVec=Ampl*cos(Freq*TV*2*pi+PHI);FV=fft(DatVec);figuresubplot(2,1,1);plot(TV,DatV ec);subplot(2,1,2);plot(abs(FV(1:round(N/2.56))));grid on[MV,MI]=max(abs(FV));%加矩形窗的解析校正--1FreqShift=SpecCorr(FV,MI,N,1);%加矩形窗的解析单频模型校正--2FreqShift=SpecCorr(FV,MI,N,2);%加汉宁窗的解析单频模型校正--3HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,3);%加矩形窗的解析单频模型校正+复比值法--4FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,4);%加汉宁窗的解析单频模型校正+复比值法--5HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,5);%加矩形窗的解析单频模型校正+复比值法+左右平均--6FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,6);%加汉宁窗的解析单频模型校正+复比值法+左右平均--7HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,7);%加矩形窗的解析单频模型校正+Quinn算法--8FV=fft(DatVec);FreqShift=SpecCorr(FV,MI,N,8);%加汉宁窗的解析单频模型校正+Quinn算法--9HanDat=DatVec.*hanning(N,'periodic')';FV=fft(HanDat);FreqShift=SpecCorr(FV,MI,N,9);===========这是子程序======================%spectrum correction assemble% the sampling interval is 1 s (or unitary)%Input: SpecVec--Discrte Fourier Spectrum from FFT% PeakIdx--the peak index, noting the matrix in MatLab start from 1% TL--the length (or the point number) of the FFT% method--correction method% output: PeakShift-- the corrected peak shifting from the peak in discrete% spectrumfunction PeakShift=SpecCorr(SpecVec,PeakIdx,TL,method)% picking up the second highest spectrum lineif(abs(SpecVec(PeakIdx-1))>abs(SpecVec(PeakIdx+1)))IP=[PeakIdx-1,PeakIdx];ShiftCorr=-1; %shift aligning with the PeakIdxelseIP=[PeakIdx,PeakIdx+1];ShiftCorr=0; %shift aligning with the PeakIdxendII=IP(1)-1; % noting that the index of a matrix in MATLAB starts from 1, not zero if(method==1) %an analyitic solution for rectangular windowU=real(SpecVec(IP));V=imag(SpecVec(IP));DW=2*pi/TL;KOPT=(sin(II*DW)*(V(2)-V(1))+cos(II*DW)*(U(2)-U(1)))/(U(2)-U(1));Z=V.*(KOPT-cos((IP-1)*DW))./(sin(DW*(IP-1)))+U;Tmp1=(Z(2)*cos(DW*(II+1))-Z(1)*cos(DW*II))/(Z(2)-Z(1));PeakPos=acos(Tmp1)/DW;PeakShift=PeakPos-(PeakIdx-1);elseif(method==2) %based on the analytical-single-tone model for rectangular window PeakShift=abs(SpecVec(IP(2)))/(abs(SpecVec(IP(2)))+abs(SpecVec(IP(1))));PeakShift=PeakShift+ShiftCorr; %shift aligning with the PeakIdxelseif(method==3) %based on the analytical-single-tone model for Hanning windowPeakShift=(2*abs(SpecVec(IP(2)))-abs(SpecV ec(IP(1))))/(abs(SpecV ec(IP(2)))+abs(SpecVec(IP(1 ))));PeakShift=PeakShift+ShiftCorr; %shift aligning with the PeakIdxelseif(method==4) %based on the analytical-single-tone model for rectangular window with complex correctionPeakShift=real(SpecVec(IP(2))/(SpecVec(IP(2))-SpecVec(IP(1))));PeakShift=PeakShift+ShiftCorr; %shift aligning with the PeakIdxelseif(method==5) %based on the analytical-single-tone model for Hanning window with complex correctionPeakShift=(2*SpecVec(IP(2))+SpecVec(IP(1)))/(SpecVec(IP(2))-SpecVec(IP(1)));PeakShift=real(PeakShift)+ShiftCorr; %shift aligning with the PeakIdx elseif(method==6) %based on the analytical-single-tone model for rectangular window with complex correction+averagePeakShift=real(SpecVec(IP(2))/(SpecVec(IP(2))-SpecVec(IP(1))));MaxPeakShift=PeakShift+ShiftCorr; %shift aligning with the PeakIdxLeftShift=real(SpecVec(PeakIdx)/(SpecVec(PeakIdx)-SpecVec(PeakIdx-1)))-1;RightShift=real(SpecVec(PeakIdx+1)/(SpecVec(PeakIdx+1)-SpecVec(PeakIdx)));%averagePeakShift=(0.5-MaxPeakShift)*LeftShift+(0.5+MaxPeakShift)*RightShift;elseif(method==7) %based on the analytical-single-tone model for Hanning window with complex correction+average,????PeakShift=(2*SpecVec(IP(2))+SpecVec(IP(1)))/(SpecVec(IP(2))-SpecVec(IP(1)));MaxPeakShift=real(PeakShift)+ShiftCorr; %shift aligning with the PeakIdxLeftShift=(2*SpecVec(PeakIdx)+SpecV ec(PeakIdx-1))/(SpecVec(PeakIdx)-SpecVec(PeakIdx-1))-1;RightShift=(2*SpecVec(PeakIdx+1)+SpecV ec(PeakIdx))/(SpecVec(PeakIdx+1)-SpecVec(PeakIdx ));%averagePeakShift=(0.5-MaxPeakShift)*LeftShift+(0.5+MaxPeakShift)*RightShift;elseif(method==8) %Quinn method for the rectangular windowa1 = real(SpecV ec(PeakIdx-1)/SpecVec(PeakIdx)); %lefta2 = real(SpecV ec(PeakIdx+1)/SpecVec(PeakIdx)); %rightLeftShift = a1/(1-a1);RightShift = -a2/(1-a2);if (LeftShift>0 & RightShift>0)PeakShift = RightShift;elsePeakShift = LeftShift;endelseif(method==9) %Quinn method for the Hanning windowa1 = real(SpecV ec(PeakIdx-1)/SpecVec(PeakIdx)); %lefta2 = real(SpecV ec(PeakIdx+1)/SpecVec(PeakIdx)); %rightLeftShift = (2*a1+1)/(1-a1);RightShift = -(2*a2+1)/(1-a2);if (LeftShift>0 & RightShift>0)PeakShift = RightShift;elsePeakShift = LeftShift;endendend。
用MATLAB做一个计算器包括加减乘除平方清空等功能6页

广西科技大学MATLAB课程设计说明书课题:设计简易计算器开发环境:MATLAB GUIDE作者:系别:专业:时间:实验目的:1、熟悉MATLAB的主要控件使用方法。
2、熟悉MATLAB的GUI设计流程。
实验环境:编程软件:MATLAB7.0实验内容与结果:使用MATLAB的GUI接口设计一个简单的计算器。
效果图:一、布局GUI。
1.打开Matlab,输入Guide 回车或者在工具栏上点击图标出现Guide 窗口:2.然后双击“Blank GUI(Default)”出现GUI窗口3.添加按钮4.根据按钮的作用及视觉效果做一定的修改把按钮的字符串大小、颜色进行设置,对按钮的位置进行排布,尽量使按钮集中在静态文本框下面。
最终设置的静态文本框为白色,其他按钮均为分红色。
5.保存、添加功能函数把做好的按钮及静态文本框保存后自动弹出Editor的M文本,对然后对相应的pushbutton添加功能函数。
以下是相应按钮的功能函数。
(1)数字按键编写。
在function pushbutton1_Callback(hObject, eventdata, handles)下输入:textString = get(handles.text1,'String');textString =strcat(textString,'0');set(handles.text1,'String',textString)这是使用句柄handles指向对象text1,并以字符串形式来存储数据文本框text1的内容,并存储数个“0”,然后由set(handles.text1,'String','textString'在text1中输出。
同理,分别在function pushbutton2~10_Callback(hObject, eventdata, handles)下给1~9数字按键下编写此类程序。
基于Matlab的谱减法语音增强的研究

基于Matlab的谱减法语音增强的研究【摘要】在实际应用中,待分析的语音信号一般是被噪声污染的语音,很大程度上影响了语音处理系统的性能。
为此,需要我们对带噪语音进行语音增强处理,抑制噪声,恢复纯净语音。
本文就谱减法对带噪语音进行处理,并利用matlab 行仿真,验证了谱减法的语音增强的效果。
【关键词】Matlab;语音增强;谱减法1.引言研究语音增强技术在实际中有重要价值。
目前,语音增强己在很多方面得到广泛的应用,例如语音处理系统、通信、多媒体技术、数字化家电等领域。
语音增强的一个主要目标,就是从带噪语音信号中提取尽可能纯净的原始语音。
根据与输入语音信号的关系,噪声可分为加性噪声和非加性噪声两类。
对某些非加性噪声而言,可以通过一定的变换转换成加性噪声。
非加性噪声主要是残响和传送网络的电路噪声等。
加性噪声通常分为宽带噪声、冲激噪声、语音干扰噪声、周期噪声等[1]。
2.谱减法基本原理谱减法的基本思想是在假定加性噪声与短时平稳的语言信号相互独立的情况下,从带噪语音的功率谱中减去噪声功率谱,从而得到较为纯净的语音频谱[2]。
如果设s(t)为纯净语音,n(t)为噪声信号,y(t)为带噪语音信号[3],则有:y(t)=s(t)+n(t)(2-1)用Y()、S()、N()分别表示y(t)、s(t)、n(t)的傅里叶变换,则可得Y()=S()+N()(2-2)由于假定语音信号与加性噪声是相互独立的,则可以得到:(2-3)如果用、、分别表示y(t)、s(t)和n(t)的功率谱,则有:=+ (2-4)而由于平稳噪声的功率谱在发声前和发声期间可以认为基本没有变化,这样可以通过发声前的所谓“寂静段”来估计噪声的功率谱,从而有:=- (2-5)图1 谱减法语音增强的基本原理图图2 仿真图这样减出来的功率谱即可认为是较为纯净的语音功率谱,然后,从这个功率谱可以恢复降噪后的语音时域信号[4]。
在具体运算时,为防止出现负功率谱的情况,减谱时当<时,令=0,即完整的减谱运算公式如下:=- ≥0 < (2-6)谱减法语音增强技术的基本原理如图1所示。
谱减法语音增强

谱减法语音增强《谱减法语音增强》课程设计报告专业:通信工程班级:姓名:指导教师:2012年5 月25 日目录一、实验目的 (2)二、实验原理 (2)三、谱减法 (2)四、实验程序代码 (3)五、实验效果图 (6)六、参考文献 (6)一、实验目的1.学会MATLAB的使用,掌握MATLAB的程序设计方法;3.掌握语音处理的基本概念、基本理论和基本方法;4.掌握基于MATLAB编程实现普检法语音增强;5.学会用MATLAB对信号进行分析和处理。
二、实验原理谱减法是利用噪声的统计平稳性以及加性噪声与语音不相关的特点而提出的一种语音增强方法。
这种方法没有使用参考噪声源,但它假设噪声是统计平稳的,即有语音期间噪声幅度谱的期望值与无语音间隙噪声的幅度谱的期望值相等。
用无语音的间隙测量计算得到的噪声频谱的估计值取代有语音的期间噪声的频谱,与含噪声语音频谱相减的估计值。
当上述差值得到负的幅度值时,将其置零。
由于人耳对语音的感知主要是通过语音信号中各频谱分量幅度获得的,对各分量的相位不敏感。
因此,此类语音增强方法将估计的对象放在短时谱幅度上。
·三、谱减法使用谱减法是假设:①噪声叠加;②声与语音不相关;③对纯净语音无先验知识;③对统计噪声有先验知识。
带噪语音模型为:y(n)=x(n)+v(n)式中,y(n)是带噪语音,s(n)是纯净语音,v(n)是噪声。
对式子两边进行傅立叶变换,得Y(k)=X(k)+N(k)由于对噪声的统计参数的未知,所以在实际应用中,通常使用非语音段噪声谱的均值来作为对噪声谱N(k)的估计,则对纯净语音幅度谱的估量表示为把带噪语音的相位当作是纯净语音的相位,那么纯净语音频谱的估量为:四、实验程序代码% speechenhancement.mclear all;%-------------------------------读入语音文件------------------------------------------------------------[speech,fs,nbits]=wavread('speech_clean1.wav'); %读入数据%-------------------------------参数定义----------------------------------------------------------------winsize=256; %窗长n=0.04; %噪声水平size=length(speech); %语音长度numofwin=floor(size/winsize); %帧数ham=hamming(winsize)'; %产生哈明窗hamwin=zeros(1,size); %定义哈明窗的长度enhanced=zeros(1,size); %定义增强语音的长度x=speech'+ n*randn(1,size); %产生带噪信号noisy=n*randn(1,winsize); %噪声估计N = fft(noisy); %对噪声傅里叶变换nmag= abs(N); %噪声功率谱%-------------------------------分帧--------------------------------------------------------------------for q=1:2*numofwin-1frame=x(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2); %对带噪语音帧间重叠一半取值hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...hamwin(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+ham; %加窗y=fft(frame.*ham); %对带噪语音傅里叶变换mag = abs(y); %带噪语音功率谱phase = angle(y); %带噪语音相位%-------------------------------幅度谱减-------------------------------------------------------------------for i=1:winsizeif mag(i)-nmag(i)>0clean(i)= mag(i)-nmag(i);elseclean(i)=0;endend%---------------------------%在频域中重新合成语音-------------------------------------------------spectral= clean.*exp(j*phase);%------------------------反傅里叶变换并重叠相加---------------------------------------------------enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)=...enhanced(1+(q-1)*winsize/2:winsize+(q-1)*winsize/2)+real(ifft(spectral));end%---------------------------除去Hamming窗引起的增益-----------------------------------------------for i=1:sizeif hamwin(i)==0enhanced(i)=0;elseenhanced(i)=enhanced(i)/hamwin(i);endend%-----------------------计算增强前后信噪比--------------------------------------------------------SNR1 = 10*log10(var(speech')/var(noisy)); %加噪语音信噪比SNR2 = 10*log10(var(speech')/var(enhanced-speech')); %增强语音信噪比wavwrite(x,fs,nbits,'noisy.wav'); %输出带噪信号wavwrite(enhanced,fs,nbits,'enhanced.wav'); %输出增强语音%-------------------------------画波形-----------------------------------------------------------figure(1);subplot(3,1,1);plot(speech');title('原始语音波形');xlabel('样点数');ylabel('幅度');axis([0 2.5*10^4 -0.3 0.3]);subplot(3,1,2);plot(x);title('加噪语音波形');xlabel('样点数');ylabel('幅度');axis([0 2.5*10^4 -0.3 0.3]);subplot(3,1,3);plot(enhanced);title('增强语音波形');xlabel('样点数');ylabel('幅度');axis([0 2.5*10^4 -0.3 0.3]);五、实验效果图00.511.522.5x 104-0.20.2原始语音波形样点数幅度00.511.522.5x 104-0.20.2加噪语音波形样点数幅度00.511.522.5x 104-0.20.2增强语音波形样点数幅度六、参考文献[1]张雄伟,陈亮,杨吉斌,现代语音处理及应用[M].北京.机械工程出版社.2003[2] 雷建军,杨震.基于短时谱估计的语音增强研究.计算机工程应用,2008[3] 邱玮炜,安宁.基于MATLAB 的谱减法语音去噪算法.科技信息.2008。
加减法matlab

加减法matlab
加减法是数学中最基础的运算之一,而matlab是一种强大的数学计算软件,可以方便地进行数值计算和数据分析。
在matlab中使用加减法非常简单,本文将分步骤阐述如何进行加减法matlab运算。
Step1:打开matlab软件
首先,我们需要打开matlab软件。
Step2:输入要计算的数值
在matlab主界面的命令窗口中,输入要进行加减法运算的数值,例如:
a=3
b=2
这里我们输入了两个数值a和b,分别赋值为3和2。
Step3:进行加法运算
要进行加法运算,我们只需要在命令窗口中输入:
a+b
matlab会自动计算出a和b的和,结果会在命令窗口中显示出来。
Step4:进行减法运算
要进行减法运算,我们只需要在命令窗口中输入:
a-b
matlab会自动计算出a和b的差,结果会在命令窗口中显示出来。
Step5:查看计算结果
计算结果会在命令窗口中自动显示出来。
如果需要将结果赋值给某个变量,也可以在命令窗口中输入:
c=a+b
这样就可以将a和b的和赋值给变量c。
除了在命令窗口中直接进行加减法运算以外,matlab还提供了一些内置的函数来进行数值计算,例如sum函数可以对数组进行求和运算,diff函数可以计算数组的差分等等。
这些函数的使用方法可以在
matlab的帮助文档中查找到。
总结:
在matlab中进行加减法运算非常简单,只需要在命令窗口中输入要计算的数值即可。
matlab还提供了许多内置的函数来进行更复杂的数值计算,可以方便地应用于科学计算、数据分析、图像处理等领域。
matlab 多项式加减

matlab 多项式加减Matlab是一种非常强大的数学软件,可以用来进行多项式加减等各种数学运算。
在Matlab中,多项式可以表示为向量,每个元素代表多项式中的一个系数。
下面我们来介绍一下如何使用Matlab进行多项式加减。
首先,我们需要定义两个多项式。
假设我们要计算多项式P(x)=2x^3+3x^2+4x+5和Q(x)=x^2+2x+1的和差,我们可以使用以下代码:```P = [2 3 4 5]; % 定义多项式PQ = [1 2 1 0]; % 定义多项式QS = P + Q; % 计算和D = P - Q; % 计算差```在上面的代码中,我们首先定义了两个多项式P和Q,分别表示为向量[2 3 4 5]和[1 2 1 0]。
这里的向量中,每个元素代表多项式中的一个系数,例如向量[2 3 4 5]表示的多项式为2x^3+3x^2+4x+5。
然后,我们使用Matlab中的加号和减号运算符来计算多项式的和差。
在上面的代码中,我们使用了加号运算符计算多项式P和Q的和,并将结果保存在向量S中;使用了减号运算符计算多项式P和Q的差,并将结果保存在向量D中。
最后,我们可以使用Matlab中的disp函数来输出计算结果。
例如,我们可以使用以下代码来输出多项式P和Q的和差:```disp(['P + Q = ', num2str(S)]); % 输出和disp(['P - Q = ', num2str(D)]); % 输出差```在上面的代码中,我们使用了Matlab中的disp函数来输出计算结果。
其中,num2str函数用于将向量转换为字符串,以便输出;字符串之间的加号用于连接字符串和向量,以便输出完整的计算结果。
综上所述,使用Matlab进行多项式加减非常简单,只需要定义多项式向量,然后使用加号和减号运算符进行计算即可。
通过这种方式,我们可以快速、准确地计算多项式的和差,为数学研究和工程应用提供了很大的便利。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
谱减法的Matlab程序:
-----------------------------------------------------------------------------------------------------
clear;
[xx,fs]=wavread('I:\aa\0a.wav'); % 读语音信号
[team,row]=size(xx);
if row==2
x=(xx(:,1)+xx(:,2))/2; % 将多通道求平均值
yy=x;
else
x=xx;
yy=x;
end
x=x-mean(x)+0.1*rand(length(x),1); % 去直流分量并加噪
N=length(x);
n=220; % 每一帧长
n1=160; %每两帧重合的长度
frame=floor((N-n)/(n-n1)); %帧数
for i=1:frame
y1=x((i-1)*(n-n1)+1:(i-1)*(n-n1)+n).*hamming(n); % 每一帧对应的语音信号
fy=fft(y1,n); %求fft
nen(i,:)=abs(fy).^2; %求能量
ang(i,:)=angle(fy); % 求角度end
yuzhi=sum(sum(nen(2:5,:)))/(4*n); % 求阈值,信号开始阶段的能量平均值
for i=1:frame
nen(i,:)=nen(i,:)-yuzhi; % 减谱
nen(i,find(nen(i,:)<0))=0; % 将小于0的部分赋值为0 end
for i=1:frame
nen(i,:)=sqrt(nen(i,:));
jie=nen(i,:).*exp(j*ang(i,:)); %求频域函数
out(i,:)=real(ifft(jie))./hamming(n)'; %求逆fft
end
zong=out(1,:)'; % 对out求导,以便于原信号比较
jiewei=n;
for i=2:frame %将一系列的帧组合还原
zong(jiewei-n1+1:jiewei)=(zong(jiewei-n1+1:jiewei)+out(i,1:n1)')/2;
jiewei=jiewei+n-n1;
zong=[zong;out(i,n1+1:end)'];
end
figure(1);
subplot(211);
plot(x); %画加噪的原始语音信号axis([1,(n-n1)*frame+n,min(x),max(x)]);
subplot(212);
specgram(x,fs,1024,n,n1); % 对应的鱼谱图figure(2);
subplot(211);
plot(zong); %画增强的语音信号
axis([1,(n-n1)*frame+n,min(zong),max(zong)]);
subplot(212);
specgram(zong,fs,1024,n,n1);
wavplay(x,fs); % 输出音频
wavplay(zong,fs);。