C语言使用正弦数据序列产生WAV文件并使用谱减法降噪

本文详细介绍了如何使用C语言生成包含正弦序列的WAV文件,并通过MATLAB进行信号分析。接着探讨了如何在WAV文件中加入自定义噪声,然后使用C语言和谱减法进行降噪处理,最后对比MATLAB实现的谱减法去噪效果,展示了谱减法在语音增强上的应用。
摘要由CSDN通过智能技术生成

谱减法技术大多数都是在频域上进行, 也有在时域的。 由于在谱减法处理过程中,是以无声期间统计平均的噪声方差代替当前分析帧各频率点的噪声频率分量,而噪声频谱具有高斯分布,即其幅度随机变化范围很宽,因此相减时,若该帧某频率点噪声分量较大, 就会有很大一部分保留, 具体来讲, 由谱减所产生的噪声称为残余噪声, 与语音信号不相关, 是由具有随机频率和幅度的窄带信号所组成。在频谱上呈现随机出现的尖峰, 便产生了间歇短暂的突发声调, 在听觉上形成有节奏性起伏的类似音乐噪声的残留噪声。这种具有音乐特性的残余噪声是各帧内在随机频率上出现的许多声调的群体结果。它比原始语音中的噪声清楚的多,也更易令人反感。这种噪声具有“音乐”的听觉效果,听起来像有“咕咕”的流水声,因此称为“音乐噪声” 。听者常常能发现处理后的语音中的“音乐噪声” 比原始信号中的噪声更为清晰,这是由于在短时谱估计中,在各帧的随机频率点上出现多种频率的组合而产生的。“音乐噪声”可以分为下面两种:一是与原来背景噪音有同样听觉特性的噪音;二是在谱减过程中生成的短时谱峰,造成人为的音乐噪音。

一、使用正弦数据序列产生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 = {
&#
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值