谱减法技术大多数都是在频域上进行, 也有在时域的。 由于在谱减法处理过程中,是以无声期间统计平均的噪声方差代替当前分析帧各频率点的噪声频率分量,而噪声频谱具有高斯分布,即其幅度随机变化范围很宽,因此相减时,若该帧某频率点噪声分量较大, 就会有很大一部分保留, 具体来讲, 由谱减所产生的噪声称为残余噪声, 与语音信号不相关, 是由具有随机频率和幅度的窄带信号所组成。在频谱上呈现随机出现的尖峰, 便产生了间歇短暂的突发声调, 在听觉上形成有节奏性起伏的类似音乐噪声的残留噪声。这种具有音乐特性的残余噪声是各帧内在随机频率上出现的许多声调的群体结果。它比原始语音中的噪声清楚的多,也更易令人反感。这种噪声具有“音乐”的听觉效果,听起来像有“咕咕”的流水声,因此称为“音乐噪声” 。听者常常能发现处理后的语音中的“音乐噪声” 比原始信号中的噪声更为清晰,这是由于在短时谱估计中,在各帧的随机频率点上出现多种频率的组合而产生的。“音乐噪声”可以分为下面两种:一是与原来背景噪音有同样听觉特性的噪音;二是在谱减过程中生成的短时谱峰,造成人为的音乐噪音。
一、使用正弦数据序列产生WAV文件
1、使用正弦数据序列生成WAV文件
先定义正弦数据序列为sin((size_buf - i)*(pi*2)/128*sin_hz)*128*sin_db/100+128,时间t=2s,频率为1000hz,db=10,buf=256,采样率为8000hz,单声道。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
//#include <unistd.h>
#include <fcntl.h>
#define sin_t 2
#define sin_hz 1000
#define sin_db 10
#define size_buf sin_t*128
#define pi 3.1415926
unsigned char buf[size_buf*2];
#if 1
typedef struct
{
char chRIFF[4]; // "RIFF" 标志
int total_Len; // 文件长度
char chWAVE[4]; // "WAVE" 标志
char chFMT[4]; // "fmt" 标志
int dwFMTLen; // 过渡字节(不定) 一般为16
short fmt_pcm; // 格式类别
short channels; // 声道数
int fmt_samplehz; // 采样率
int fmt_bytepsec; // 位速
short fmt_bytesample; // 一个采样多声道数据块大小
short fmt_bitpsample; // 一个采样占的 bit 数
char chDATA[4]; // 数据标记符"data "
int dwDATALen; // 语音数据的长度,比文件长度小42一般。这个是计算音频播放时长的关键参数~
}WaveHeader;
WaveHeader WavInf = {
&#