在C程序中,读取pcm格式的音频

wonderfu3311 2009-05-22 10:16:23
各位大虾 帮帮忙啊
如题 ,pcm格式的文件属于二进制文件吗?
好像不能按二进制文件读取....
那么根据什么来判断输入信号的幅度值大小呢?
8位还是16位呢?

谢谢啊~~ 哪位有源程序最好啊~~~感激不尽!
...全文
960 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxufeiyang 2009-06-01
  • 打赏
  • 举报
回复
学习
wonderfu3311 2009-05-26
  • 打赏
  • 举报
回复
感谢LS~~~呵呵
程序明白,可是输出就不理解了,希望能帮忙解答下



就是根据PCM文件所占容量的公式:   
存储量=(采样频率*采样位数*声道)*时间/8(单位:字节数)
我得到:10086的DTMF信号所占的存储容量为:

(44.1*1000*16*2)*1.15s/8=202860个字节


但是 一共有5个DTMF信号,也就是说,每个信号占了40572个字节

于是 我将这40572个自己读入buffer中,但是输出是


pcm=0 0 0 0 22


应该怎么辨别这5个信号的幅值大小呢?

每个信号间还有400ms的暂停时间,这部分是也算在编码里面了?还是?


问题比较多,呵呵 谢谢~~~
日光降临 2009-05-26
  • 打赏
  • 举报
回复

给你一段正确的,自己看吧. 我是在linux下编译的.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void)
{
int i;
FILE *fp1;
unsigned char buffer[256];//你定义的类型是整形, 长度是5,

fp1=fopen("test.pcm","rb+");

if(fp1==NULL)
{
printf("file can not be open \n");
exit (1);
}
else
printf("ok\n");

memset(buffer, 0, sizeof(buffer));
fread (&buffer, 32, 5, fp1);//你说32字节, 你写的怎么是40527?
for (i=0; i <= 4; i++)
{
printf("pcm=%d\n",buffer[i]);
}

return 0;
}
Treazy 2009-05-25
  • 打赏
  • 举报
回复
PCM数据就是一串数据流
8位或者16位是你采样数据的位数,是个已知量

wonderfu3311 2009-05-25
  • 打赏
  • 举报
回复
int main (void)
{
int i;
FILE *fp1;
int buffer[5];

fp1=fopen("d:\\10086.pcm","rb+");

if(fp1==NULL)
{ printf("file can not be open \n");
exit (1);
}
else

printf("ok\n");

fread (&buffer,40527,5,fp1);//从fp1指定的文件中,读取5个数据项,每个数据项长度为32个字节,放入buffer所指定的缓存区中
for (i=0;i<=4;i++)
{

printf("pcm=%d\n",buffer[i]);

}
system("pause");


}

大家再给帮帮忙,我现在编了这样一段程序,想实现上面的功能,但是输出总是不对
请问下问题究竟在哪里啊?

谢谢大虾们啦~~~~
基于单片机的MP3播放器设计[1] 音频信号数字化后所面临的一个不容忽视的问题是:巨大的数据量给存储和传输带来 的压力。因此音频压缩技术在广播专业领域、网络传输及多媒体使用受到广泛关注, 成为音频信号处理的关键技术之一。MPEG(Moving Picture Experts Group)运动图像专家组,在1992年底制定了第一个世界范围的Hi-Fi(High- Fidelity)质量的音频编码标准MPEG-1。MPEG- 1分为三种不同的方式,称为Layer1、Layer2和Layer3。序号越高,复杂性越大,但是可 提供更好的编码效率,特别是在低比特率时。MP3就是MPEG-1 Layer3,是基于感知编码的算法,目前在CD音质的声音压缩方面,是一种通用的方法。 使用MP3标准对于音频数据编码既可以获得较大的音频数据压缩比,又可以得到较好的音 乐回放质量。MP3的解码器结构复杂,涉及到大量的数学计算,对处理器和内存的要求相 当高。目前,AT89C51处理器以其高性价比,丰富的外设资源,越来越受到各种嵌入式研 发人员的青睐[5- 7]。基于以上背景,我在此次设计提出了AT89C51SND1C微处理器的软件解码方案,在 降低硬件成本的基础上保证高质量的播放效果。 1.2.2 课题研究的意义 MP3音频播放器的最合理工作速度为30Mips,而一个典型的视频媒体播放器的理想速 度则为175Mips,所以提高MP3的工作速度,以及改善MP3的音质是最关键的,也是亟待解 决的问题。 MP3是一种典型的嵌入式设备,而现在市场上比较常见的是闪存式MP3。由于闪存式M P3的容量限制,使它存储歌曲数目较少,在功能上也很难实现多样化。而硬盘式MP3的多 功能及大容量,也必将受到不少消费者的喜爱。 另外一个原因是近年来,嵌入式系统和单片机开发的有机结合,已广泛被使用于网络 通信、工业控制、机顶盒、PDA等诸多领域[8]。本文提出了一种基于单片机的MP3播放器 的设计方案,这就进一步的体现了该设计的灵活性。目前该设计方案已经实现,实践证 明,此播放器拥有市面MP3所有的全部功能并能够很好的运行。 MP3播放器一般分成3个部分:CPU、MP3硬件解码器存储器。其可以将前两部分集成 在一起,即带MP3硬件解码器的CPU;或将后两部分集成在一起,即集成硬件解码、D/A 转换及音频输入。存储器可以是Flash存储器或硬盘。通过用MP3编码技术,可以得到大 约12:1压缩的有损音乐信号。尽管MP3音乐是有损的,它在压缩过程对功率谱较弱的 信号有所丢失,但它同CD原声区别不大,不影响一般音乐爱好者对音乐的欣赏。MP3大大 缩小了声音文件的长度,使音乐的存储和传输更方便。 2 MP3的编解码过程 2.1 MP3的工作原理 一个完整MP3播放器要分几个部分:央处理器、解码器、存储设备、主机通讯端口 、音频D/A和功放、显示界面和控制键、其央处理器和解码器是整个系统地核心。这 里的央处理器我们通常成为MCU(单片微处理器),简称单片机。它运行MP3的整个控 制程序,也称为fireware(或者固件程序)。控制MP3的各个部件的工作:从存储设备读 取数据送到解码器解码;和主机连接时完成和主机的数据交换;接收控制按键的操作; 显示系统运行状态等任务。解码器是芯片的一个硬件模块,或者说是硬件解码(有的 MP3播放机是软件解码,由高速央处理器完成)。它可以直接完成各种格式MP3数据流 的解码操作,并输出PCM或I2S格式的数字音频信号[10]。 存储设备是MP3播放机的重要部分,通常的MP3随身听都是采用半导体存储器(FLASH MEMORY)或者硬盘(HDD)作为储存设备的[11]。它通过接收储存主机通讯端口传来的 数据(通常以文件形式),回放的时候MCU读取存储器的数据并送到解码器。数据的存 储是要有一定格式的,众所周知,PC管理磁盘数据是以文件形式,MP3亦不例外,最常用 的办法就是直接利用PC的文件系统来管理存储器,微软操作系统采用的是FAT文件系统, 这也是最广泛使用的一种[12]。播放机其一个任务就是要实现FAT文件系统,即可以从 FAT文件系统支持的磁盘按文件名访问并读出其的数据。 主机通讯端口是MP3播放机和PC机交换数据的途径,PC通过该端口操作MP3播放机存储 设备的数据,拷贝、删除、复制文件等操作。目前最广泛使用的是USB总线,并且遵循 微软定义的大容量移动存储协议规范,将MP3播放机作为主机的一个移动存储设备。这里 需要遵循几个规范:USB通信协议、大容量移动存储器规范和SCSI协议[13-15]。 音频DAC是将数字音频信号转换成模拟音频信号,以推动耳机、功放等模拟音响设备 。这里要介绍一下数字音频信号。数字音频信号是

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧