Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28640
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-02 10:41
文章分类
文章存档

2013年(10)

我的朋友

分类: 嵌入式

2013-04-03 08:20:39

原文地址:数字混音原理 作者:BENNYSNAKE

Step 1, 

Get the Raw data of the two files, (Example, of the sample 8bit and 8Kh, means one sample is of
8bit)


Step 2 

Let the two audio signal be A and B respectively, the range is between 0 and 255. Where A and B are the
Sample Values (Each raw data) And store the resultant into the Y

If Both the samples Values are possitve

Y = A + B - A * B / 255 

Where Y is the resultant signal which contains both signal A and B, merging two audio streams into single 
stream by this method solves the problem of overflow and information loss to an extent. 


If the range of 8-bit sampling is between -127 to 128 

If both A and B are negative Y = A +B - (A * B / (-127)) 
Else Y = A + B - A * B / 128 


Similarly for the nbit (ex 16bit data)

For n-bit sampling audio signal 


If both A and B are negative Y = A + B - (A * B / (-(2 pow(n-1) -1))) 
Else Y = A + B - (A * B / (2 pow(n-1)) 


Step 3.

Add the Header to the Resultant (mixed) data and play back.

If some thing is unclear and ambigious let me know.

Regards
Ranjeet Gupta.

还有简单C程序示意代码,但是其中包含了核心算法:

#include 
#include 
#include 
#include 

int main(int argc,char *argv[]) {
char mixname[255];
FILE *pcm1, *pcm2, *mix;
char sample1, sample2;
int value;

pcm1 = fopen(argv[1],"r");
pcm2 = fopen(argv[2],"r");

strcpy (mixname, argv[1]);
strcat (mixname, "_temp.wav");
mix = fopen(mixname, "w");

while(!feof(pcm1)) {

sample1 = fgetc(pcm1);
sample2 = fgetc(pcm2);

if ((sample1 < 0) && (sample2 < 0)) {
value = sample1 + sample2 - (sample1 * sample2 / -(pow(2,16-1)-1));
}else{
value = sample1 + sample2 - (sample1 * sample2 / (pow(2,16-1)-1));
}

fputc(value, mix);
}


fclose(pcm1);
fclose(pcm2);
fclose(mix);

return 0;
}

阅读(1222) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~