转换原理比较简单,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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)