采样频率如何降低

采样频率如何降低,第1张

用一麦克风录制的PCM数据,为16bit、48KHz、单声道,而我希望得到的是16KHz采样率的PCM数据,那就通过降低采样率的方法,去实现48000HZ到16000HZ采样率的转换。

转换原理比较简单,48000HZ降到敬衫16000HZ,实际上降了3倍,同一时间的单位区间内,48000HZ采样了3个点,16000HZ则采样了1个点扰侍,即从48000HZ的文件中每读取3个数据,就要根据这3个数据去推算得到1个数据,而这个数据对应的就是16000HZ文件中的一个数据。

这里写图片描述

具体实现如下

C语言实现

#define OLD_FILE_PATH "file.pcm"

#define DOWN_FILE_PATH "downsample.pcm"

void pcm_downsample(void)

{

short sRead = 0

short tempSum = 0

int size = 0

int flag = 0

FILE *fp = fopen(OLD_FILE_PATH, "rb+")

FILE *fp_down = fopen(DOWN_FILE_PATH, "wb+")

while(!feof(fp))

{

size = fread(&sRead, 2, 1, fp)// 一次读两个字节,16bit

if(size>0)

{

tempSum = tempSum + sRead// 求和

flag++

if(flag == 3) // 如果取了三个点

{

flag = 0

tempSum = tempSum/3 // 求平均值,你可以根据自己需要去修改,不一定要求平均值,可以直接取一个点缓稿吵

fwrite(&tempSum, 2, 1, fp_down)

tempSum = 0

}

}

}

fclose(fp)

fclose(fp

这里我将3个点转换成1个点的算法,是求取平均值的算法,你可以利用其他算法去转换也可以,如果想降低成其他采样率的,只要按照对应的比例去采样,即可。

你好,我来为你解答:

#include<reg51.h>

unsigned char paixu[10] _at_ 0x50

void main()

{

unsigned char i,j,temp

/*-------test----------

paixu[0]=1paixu[1]=3

paixu[2]=7paixu[3]=9

paixu[4]=25paixu[5]=11

paixu[6]=8paixu[7]=13

paixu[8]=27paixu[9]=53*/

for(j=0j<9j++)

{

for(i=0i<9i++)

{

if(paixu[i] >paixu[i+1])

{

temp= paixu[i]

paixu[i]=paixu[i+1]

paixu[i+1]=temp

}

}

}

}

程序用KEIL测试通过,将main改成其他尺让函数名就可以了桥困旁!敏橡

第二小问应该是输出100~999之间个位数字是7的所有素数差态之前庆山和吧.

完整的C语言程序如下

#include<stdio.h>

int isprime(int x){

int i

if(x<2) return 0

for(i=2i<xi++)

if(x%i==0)

return 0

return 1

}

int main(){

int i,sum=0

for(i=100i<=999i++){

if(isprime(i)==1 &&i%10==7){

sum=sum+i

}

}

printf("100~999之间慧中个位数字是7的所有素数之和为%d\n",sum)

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12434486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存