语音信号采集和播放

sndtools.c

#include <stdio.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#define VAR_STATIC
#include "sndtools.h"
int devfd = 0;
/*
* Open Sound device
* Return 1 if success, else return 0.
*/
int OpenSnd(/* add by new version */int nWhich)
{
if(devfd > 0)
close(devfd);
devfd = open("/dev/sound/dsp", O_RDWR);
if(devfd < 0)
return 0;
return 1;
}
/*
* Close Sound device
* return 1 if success, else return 0.
*/
int CloseSnd(/* add by new version */int nWhich)
{
close(devfd);
devfd = 0;
return 1;
}
/*
* Set Record an Playback format
* return 1 if success, else return 0.
* bits -- FMT8BITS(8bits), FMT16BITS(16bits)
* hz -- FMT8K(8000HZ), FMT16K(16000HZ), FMT22K(22000HZ), FMT44K(44000HZ)
*/
int SetFormat(int bits, int hz)
{
int tmp = bits;
if( -1 == ioctl(devfd, SNDCTL_DSP_SETFMT, &tmp))
{
#ifdef DEBUG_WARN
printf("Set fmt to s8_little failed:%d//n", nWhich);
#endif
return 0;
}
tmp = hz;
if( -1 == ioctl(devfd, SNDCTL_DSP_SPEED, &tmp))
{
#ifdef DEBUG_WARN
printf("Set speed to %d:%d//n", hz, nWhich);
#endif
return 0;
}
return 1;
}

/*
* Set Sound Card Channel
* return 1 if success, else return 0.
* chn -- MONO, STEREO
*/
int SetChannel(int chn)
{
int tmp = chn;
if(ioctl(devfd, SNDCTL_DSP_CHANNELS, &tmp)==-1)
{
#ifdef DEBUG_WARN
printf("Set Audio Channel failed:%d//n", nWhich);
#endif
return 0;
}
return 1;
}
/*
* Record
* return numbers of byte for read.
*/
int Record(char *buf, int size)
{
return read(devfd, buf, size);
}
/*
* Playback
* return numbers of byte for write.
*/
int Play(char *buf, int size)
{
return write(devfd, buf, size);
}

 

main.c

#include <stdio.h>

#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#define VAR_STATIC
#include "sndtools.h"
int devfd = 0;
/*
* Open Sound device
* Return 1 if success, else return 0.
*/
int OpenSnd(/* add by new version */int nWhich)
{
if(devfd > 0)
close(devfd);
devfd = open("/dev/sound/dsp", O_RDWR);
if(devfd < 0)
return 0;
return 1;
}
/*
* Close Sound device
* return 1 if success, else return 0.
*/
int CloseSnd(/* add by new version */int nWhich)
{
close(devfd);
devfd = 0;
return 1;
}
/*
* Set Record an Playback format
* return 1 if success, else return 0.
* bits -- FMT8BITS(8bits), FMT16BITS(16bits)
* hz -- FMT8K(8000HZ), FMT16K(16000HZ), FMT22K(22000HZ), FMT44K(44000HZ)
*/
int SetFormat(int bits, int hz)
{
int tmp = bits;
if( -1 == ioctl(devfd, SNDCTL_DSP_SETFMT, &tmp))
{
#ifdef DEBUG_WARN
printf("Set fmt to s8_little failed:%d//n", nWhich);
#endif
return 0;
}
tmp = hz;
if( -1 == ioctl(devfd, SNDCTL_DSP_SPEED, &tmp))
{
#ifdef DEBUG_WARN
printf("Set speed to %d:%d//n", hz, nWhich);
#endif
return 0;
}
return 1;
}

/*
* Set Sound Card Channel
* return 1 if success, else return 0.
* chn -- MONO, STEREO
*/
int SetChannel(int chn)
{
int tmp = chn;
if(ioctl(devfd, SNDCTL_DSP_CHANNELS, &tmp)==-1)
{
#ifdef DEBUG_WARN
printf("Set Audio Channel failed:%d//n", nWhich);
#endif
return 0;
}
return 1;
}
/*
* Record
* return numbers of byte for read.
*/
int Record(char *buf, int size)
{
return read(devfd, buf, size);
}
/*
* Playback
* return numbers of byte for write.
*/
int Play(char *buf, int size)
{
return write(devfd, buf, size);
}

sndtools.h

#ifndef SNDTOOLS_H
#define SNDTOOLS_H

#include <linux/soundcard.h>
#define FMT8BITS AFMT_S8_LE
#define FMT16BITS AFMT_S16_LE

#define FMT8K 8000
#define FMT16K 16000
#define FMT22K 22000
#define FMT44K 44000

#define MONO 1
#define STERO 2

#ifndef VAR_STATIC
extern int devfd;
extern int CapMask;
#endif //ifndef VAR_STATIC

//Open sound device, return 1 if open success
//else return 0
int OpenSnd();

//Close sound device
int CloseSnd();

//Set record or playback format, return 1 if success
//else return 0
int SetFormat(int bits, int hz);

//Set record or playback channel, return 1 if success
//else return 1
int SetChannel(int chn);

//Record
int Record(char *buf, int size);

//Playback
int Play(char *buf, int size);

#endif //ifndef SNDTOOLS_H

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计要求 1、语音信号采集利用 Windows下的录音机,录制一段自己的话音,时间在1s内然后在Matlab软件平台下,利用函数wavread对语音信号进行采样,记住采样频率和采样点数。 2、语音信号的频谱分析在Matlab中,可以利用函数fft对信号进行快速傅立叶变换,得到信号的频谱特性,要求学生首先画出语音信号的时域波形,然后对语音信号进行频谱分析。 3、设计数字滤波器和画出其频率响应给出各滤波器的性能指标; 给定滤波器的性能指标如下: (1)低通滤波器的性能指标:fb=1000Hz,fc=1200Hz,As=100dB,Ap=1dB, (2)高通滤波器的性能指标:fb=5000Hz,fc=4800Hz, As=100dB,Ap=1dB, (3)带通滤波器的性能指标:fb1=1200Hz,fb2=3000Hz, fc1=1000Hz,fc2=3200Hz, As=100dB,Ap=1dB, 采用窗函数法和双线性变换法设计上面要求的3种滤波器,并画出滤波 器的频率响应。 4、用滤波器对信号进行滤波 ,然后用自己设计的滤波器对采集到的信号进行滤波,画出滤波后信号的时域波形及频谱,并对滤波前后的信号进行对比,分析信号的变化; 5、回放语音信号,分析滤波前后的语音变化; 6、设计系统界面,为了使编制的程序操作方便,设计处理系统的用户界面,在所设计的系 统界面上可以实现上述要求中的包括采集、分析、滤波等全部内容,并能够选 择滤波器的类型,输入滤波器的参数、显示滤波器的频率响应等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值