ADI Blackfin DSP处理器-BF533的开发详解66:MP3解码(含源码)

news2024/11/21 0:33:05

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

代码实现功能

代码实现了读取工程目录下的一个 MP3 文件,对文件进行解码后,将生成的数据以 PCM 文件的形式保存在工程目录下。代码调用了 MP3 解码库,该解码库可对采样率 44.1KHz,位速 128Kbps 的 MP3 文件进行解码。解码后文件以 PCM 格式保存,通过 GoldWave 软件可对文件进行播放。

代码使用说明

主要函数说明:
int find_head(unsigned char *start,unsigned char *end)
参数:start :mp3 数据的起始内存地址
End :mp3 数据的终止内存地址
返回值:音频帧的起始地址,相对 start 的偏移量。
作用:从 start 到 end 的内存进行音频帧的查询,得到距离 start 地址最近的帧位置。
int check_data(char * pMp3Stream,char *pPCMStream,int *in_size,int *out_size,FILE *save_file)
参数:pMp3Stream :mp3 数据帧的起始位置,可参照 demo 的使用(至少有 0x20 个数据 字节):mp3 数据的起始地址+帧的偏移地址;
pPCMStream :mp3 解码数据的存储地址,必须要保证 4920 字节长度。
in_size :返回针对本 mp3 音频格式的每次解码所需的数据帧大小
out_size :返回针对本 mp3 音频格式的每次解码后的数据大小
save_file:如果进行文件保持,该项传递要保存文件的指针。
如果不用进行文件保存,则传递 0x0 参数。
返回值:1:表示检测过程真确,得到了文件的信息,并保证返回的参数有效;
-1:表示本次检测失败;原因:pMp3Stream 的地址是否是帧起始地址;该地址 开始是否存储有 mp3 数据 0x20 个字节。

作用:通过对 mp3 的帧数据进行检测,得到 mp3 文件的相关信息,并计算出该文件的帧大小和解码后数据的大小。
int MP3DEC_decode( unsigned char *pInData,
unsigned long inSize,
unsigned char *pOutData,
unsigned short *pGetSize,
MP3DEC_Params *pDecParams)
参数:pInData:mp3 的单帧起始地址
inSize :单帧的数据大小
pOutData:单帧解码后的数据存储起始地址
pGetSize :已解码的数据大小
pDecParams:解码的相关参数
返回值:1:表示该帧数据解码的数据有效
其它:表示该帧数据解码数据无效
作用:对需要解码的 mp3 数据帧进行解码;
.
片断分析:
pMp3Stream = mp3_stream;
pPCMStream = dataA;
MP3DEC_init(); //初始化相关的数据
output_file = fopen(“…/test.wav”,“wb”);//打开解码结果的存储文件
input_file = fopen(“…/test.mp3”,“rb”);//打开需要进行解码的文件
result_num = fread(mp3_stream,1,0x300000-0x1000,input_file);
//读取的大小 0x300000-0x1000 是针对本 demo 代码只给予输入 mp3 数据最大的内存容量
//来决定的
asm(“ssync;”);
mp3_stream_bufend = &mp3_stream[0] + result_num;//mp3 数据的结束地址
head_flag = find_head(pMp3Stream,mp3_stream_bufend); //寻找 mp3 数据的音频同步
//帧的位置
decode_flag = pMp3Stream+head_flag;
result = check_data(decode_flag,pPCMStream,&input_mp3,&output_mp3,output_file);
//检查音频帧和数据流
if(result == -1)
{
printf(“error mp3 file format \n”);
}
while(1)
{

result = MP3DEC_decode(decode_flag,input_mp3,pPCMStream,&decodedSize_t,&myDecParams_t);
//进行每一音频帧的解码操作

if(result == 1)
{
frame_num++;
pPCMStream += output_mp3;
if(frame_num>0x100)
{
fwrite(dataA,1,output_mp3frame_num,output_file);//保存解码结果
asm(“ssync;”);
frame_num = 0;
pPCMStream = dataA;
}
}
decode_flag += input_mp3;
if(decode_flag+input_mp3 >= mp3_stream_bufend)//判断解码是否完成
{
fwrite(dataA,1,output_mp3
frame_num,output_file);
asm(“ssync;”);
break;
}
}
fclose(output_file);
fclose(input_file);
MP3DEC_exit();
注意事项:
1. 函数只能对 128kbps、44.1kHz 存储格式的 mp3 文件进行解码;
2. 用户在自己生成工程中使用该解码库,必须向工程中添加 mp3dec_lib.dlb, testbf533.ldf。 3. 如果用户更改了工程属性,那么该操作会反映给 LDF 文件,那么需要把原始的 LDF 再次拷贝到工程下。

代码实验步骤

  1. 编译代码
  2. 运行代码,查看原工程下生成的 PCM 文件,正常解码后,刷新时能看到 PCM 文件大小会慢慢增加。如,没有慢慢增加或过早退出工程,说明解码失败,可以尝试重新编译代码,然后按 F10 键,单步方式将代码运行到 MP3 循环解码的函数里,然后再按 F5 键连续运行。
  3. 待代码运行结束后,确认代码已执行过代码中的 fclose(output_file)函数,然后可以使用 GoldWave 软件,打开 PCM 文件。当提示文件打开格式时,按如图配置:

在这里插入图片描述

  1. 加载完数据后,即可播放解码后的 PCM 数据流。

代码实验结果

工程下生成 MP3 文件解码后的 PCM 文件,用 GoldWave 软件可以对其进行播放,听到解码后数据音乐。

程序源码

cpu.c

#include <cdefBF533.h>

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}

delay(int tem)
{
int i;
for(i=0;i<tem;i++);
}

main.c

#include <cdefBF533.h>
#include <stdio.h>
#include <sys\exception.h>
#include <ccblkfn.h>
#include “api_mp3dec.h”

MP3DEC_Params myDecParams_t;

void main(void)
{
int input_mp3,frame_num,decodedSize;
int output_mp3;
int head_flag;
unsigned short decodedSize_t;
char * decode_flag,*pMp3Stream,*pPCMStream,*mp3_stream_bufend;
char * mp3_stream;
char * dataA;
int result_num;
FILE *output_file;
FILE *input_file;
int result = 0;
frame_num = 0;
result_num = 0;

Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
mp3_stream = 0x1000;
dataA = 0x300000;
decode_flag = dataA;
int i;
for( i = 0;i<0x100*1248 * 4;i++)
{
	*decode_flag++ = 0;
}
pMp3Stream = mp3_stream;
pPCMStream = dataA;

MP3DEC_init();

output_file = fopen("../test.pcm","wb");
input_file = fopen("../test.mp3","rb");

result_num = fread(mp3_stream,1,0x300000-0x1000,input_file); 	
asm("ssync;");

mp3_stream_bufend = &mp3_stream[0] + result_num;

head_flag = find_head(pMp3Stream,mp3_stream_bufend);

decode_flag = pMp3Stream+head_flag;

result = check_data(decode_flag,pPCMStream,&input_mp3,&output_mp3,output_file);
delay(100);	
if(result == -1)
{
	printf("error mp3 file format \n");
}
while(1)
{
	  
   result = MP3DEC_decode(decode_flag,input_mp3,pPCMStream,&decodedSize_t,&myDecParams_t);

   	if(result == 1)
   	{
		frame_num++;
		pPCMStream += output_mp3;
		if(frame_num>0x100)
		{
			fwrite(dataA,1,output_mp3*frame_num,output_file);
			asm("ssync;");	
			frame_num = 0;
			pPCMStream = dataA;
			
		}
	//	fwrite(pPCMStream,1,output_mp3,output_file);
		

	}
   decode_flag += input_mp3;

   if(decode_flag+input_mp3 >= mp3_stream_bufend)
   {
   		fwrite(dataA,1,output_mp3*frame_num,output_file);
   		asm("ssync;");
		break;	
   }
}


fclose(input_file);	
fclose(output_file);
printf("pcm file done!\n");	
MP3DEC_exit();

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/106280.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于数组的一些题---获取数组对象的各种数据

关于数组的一些题—获取数组对象的各种数据 题目1:将数组对象中的属性值提出来生成新的对象 var arr [{label:男&#xff0c;value: 1}, {label:女&#xff0c;value: 0}]function f(arr) {// 写代码&#xff0c;得到 } var obj f(arr); console.log(obj) // obj {1: 男&am…

1 | Trerraform的使用及创建CVM

目录1 Trerraform简介2 Trerraform的安装2.1 参考地址2.2 安装方式3 使用Terraform管理腾讯云3.1 创建帐号并授权3.2 添加Terraform的环境变量3.3 配置provider文件3.4 terraform init3.5 terraform init -upgrade3.6 terraform plan3.7 terraform apply3.8 terraform destroy4…

5分钟让你做出HR一眼看中的简历,方法简单易操作

写简历&#xff0c;真的是个“力气活”。 但凡求职经验丰富的朋友们&#xff0c;可以仔细想一想&#xff0c;之前我们面试求职的过程中&#xff0c;哪次不是通宵达旦在修改和“润色”简历中&#xff0c;在写简历里费劲功夫&#xff0c;目的还是为了引起HR的关注&#xff0c;从…

DASOU知识星球学的知识图谱

1.经典课程 1.经典课程 东南大学研究生课程: 东南大学研究生课程&#xff1a; https://github.com/npubird/KnowledgeGraphCourse 书籍推荐: 知识图谱的书籍的话可以看下作者是王昊奋【知识图谱:方法、实践与应用】那本书&#xff0c;算是近些年出版的里面质量不错的了&…

解决问题:VMware Tools 启动脚本未能在虚拟机中成功运行。

目录 问题 解决 方法一、重装 open-vm-tools-desktop 方法二、重装 vmware-tools 问题 Ubuntu 虚拟机开机时提示报错&#xff0c;具体信息如下&#xff1a; VMware Tools 启动脚本未能在虚拟机中成功运行。如果您在此虚拟机中配置了自定义启动脚本&#xff0c;请确保该脚本…

USB TO SPI(上海同旺电子)调试器调试TC77温度传感器(三线SPI)

所需设备&#xff1a; 1、USB TO SPI(上海同旺电子)&#xff1b; 2、TC77 带 SPI 接口的温度传感器; 特别注意TC77温度传感器(三线制SPI) 特性 • 5引脚 SOT-23A 和8引脚SOIC 封装的数字温度传感器 • 以13 位数字字格式输出温度值 • SPI 和 MICROWIRE™ 兼容接口 • 固态…

IB科学课程的Group 4 project是什么?

。IBDP第4科学科目组中的科学类课程是必选课程。中国IB学生常选物理、化学、生物、计算机科学这类IB科学课程。这些IBDP科学课程都有一个共同的课程项目&#xff0c;那就是——The group 4 project&#xff01; 什么是The group 4 project&#xff1f; The group 4 project是一…

图表控件TeeChart for .NET系列教程四:轴控制(中)

TeeChart for .NET是优秀的工业4.0 WinForm图表控件&#xff0c;官方独家授权汉化&#xff0c;集功能全面、性能稳定、价格实惠等优势于一体。TeeChart for .NET 中文版还可让您在使用和学习上没有任何语言障碍&#xff0c;至少可以节省30%的开发时间。 TeeChart for .NET最新…

【Python黑帽子】——简易的ZIP文件密码破解器

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门 创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座…

[翻译+笔记]生成对抗网络: 从GAN到WGAN

最近读了一篇社会力模型的论文, 里面用到了GAN, 发现自己不是很懂. 想翻译一下一个大神的博客, 做一下笔记. 并不是全文翻译, 只翻译一部分. 原文地址: from GAN to WGAN 1. K-L和J-S散度 在介绍GAN之前, 首先复习一下衡量两个概率分布相似度的两种指标. (1) K-L散度: KL散度…

java Lambda表达式 省略模式写法

我们先来看一个普通的Lambda表达式 我们创建一个包 下面创建一个接口 testInterface 参考代码如下 public interface testInterface {int eat(int max,int min); }text 测试类 参考代码如下 public class text {public static void main(String args[]) {newTestInterface(…

夺冠热度空前,梅西Instagram粉丝破4亿,跨境卖家如何借这股东风?

阿根廷队世界杯夺冠&#xff0c;35岁的梅西终于实现了职业生涯大满贯&#xff0c;全世界球迷都在为梅西欢呼。梅西夺冠的热度席卷全球&#xff0c;当前其Instagram账号的粉丝就突破了4亿&#xff0c;成为世界上第二个Instagram粉丝超4亿的人。 梅西夺冠当日在Instagram上的发帖…

易观千帆 | 2022年11月银行APP月活跃用户规模盘点

易观分析&#xff1a;11月手机银行服务应用活跃人数52639.05万&#xff0c;环比增长0.68%&#xff1b;排在前三的手机银行APP仍然为中国工商银行、中国农业银行、中国建设银行。 11月城商行手机银行服务应用活跃人数3730.98万&#xff0c;环比增长4.64%&#xff0c;从月活表现来…

Spring Boot 实现 SSE 服务端推送事件

源码地址 关于 SSE SSE 全程 Server Send Event&#xff0c;是 HTTP 协议中的一种&#xff0c;Content-Type 为 text/event-stream&#xff0c;是服务端主动向前端推送数据。类似于 WebSocket。 SSE 优势我们可以划分为两个&#xff1a; 长链接服务端能主动向客户端推送数据…

想要精通算法和SQL的成长之路 - 编辑距离

想要精通算法和SQL的成长之路 - 编辑距离前言一. 编辑距离1.1 定义动态规划数组1.2 定义动态规划方程1.3 定义数组的初始化1.4 最终答案前言 想要精通算法和SQL的成长之路 - 系列导航 一. 编辑距离 原题链接 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 …

DataFactory根据字段类型在mysql插入数据

目录 插入Varchar类型数据 场景一&#xff1a;主键使用uuid 场景二&#xff1a;从外部导入数据 场景三&#xff1a;使用组合方式 插入data类型日期数据 插入Varchar类型数据 insert value from an data table &#xff1a;表示可以通过外部数据创建数据表插入字符串值 i…

实验二B 图像的空域与频域滤波(源代码一站式复制粘贴)

实验二B 图像的空域与频域滤波一、实验目的二、实验原理三、实验内容与要求四、实验的具体实现一、实验目的 1.掌握图像滤波的基本定义及目的。 2.理解空间域滤波的基本原理及方法。 3.掌握进行图像的空域滤波的方法。 4.掌握傅里叶变换及逆变换的基本原理方法。 5.理解频域滤…

算法刷题打卡第52天:排序数组---桶排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]桶排序…

2022 CSDN 客服年终总结

hello&#xff0c;大家好&#xff0c;这里是《听用户心声&#xff0c;解用户之需》之 2022 年终总结篇。 秉承“用户至上”的服务理念&#xff0c;为了给用户提供极致的服务体验而时刻努力着&#xff0c;2022年&#xff0c;在大家的一致努力下&#xff0c;究竟有何成效呢&#…

SpringBoot1:helloword、导入依赖、配置项设置,打包方法、lombok、dev-tools、Spring Initailizr、常见注解

1.简介 简化Spring开发的一个框架。对整个Spring技术栈的大整合 J2EE企业级开发的一站式解决方案。 2.微服务 一个应用应该是一组小型服务&#xff0c;可以通过HTTP的方式来进行互通 每一个功能元素都是可独立替换&#xff0c;和独立升级的软件单元。 3.HelloWord 功能&am…