gpt4 book ai didi

c - 像 Matlab 在 C 中那样读取原始音频文件

转载 作者:太空宇宙 更新时间:2023-11-04 07:15:55 25 4
gpt4 key购买 nike

我有以下我想用 C 编写的小脚本:

`%% getting the spectgrum 
clear, clc ;

fileName ='M0.raw'
[x,fs] = audioread(fileName);
[xPSD,f] = pwelch(x,hanning(8192),0,8192*4 ,fs);
plot(f,10*log10(abs(xPSD)));
xlim([0 22e3]);
absxPSD = abs(xPSD);
save('absXPSD.txt','absxPSD','-ascii');
save('xPSD.txt','xPSD','-ascii');
save('xValues.txt','x','-ascii');
save('frequency.txt','f','-ascii');`

没有详细说明,我在获得正确结果时遇到了问题,当我检查时发现我读取的数据是错误的这里是读取原始文件以将其与 Matalb 读取的数据进行比较的示例:

#include <stdio.h>
#include <stdlib.h>
int main (){

FILE* inp =NULL;
FILE* oup =NULL;
double value =0;

inp = fopen("M0.raw","r");
oup = fopen("checks.txt","w+");

更新在 LoPiTaL 的回答之后,我尝试使用 fseek

跳过长度为 44Byte 的 RIFF header
fseek (inp,352,SEEK_SET);// that didn't help getting the right result !! 

if( inp == NULL || oup==NULL){
printf(" error at file opning \n");
return -1;
}

while (!(feof(inp))){

fread(&value,sizeof(double),1,inp);
printf(" %f \n ",value);
fprintf(oup,"%f\n",value);
}
fclose(inp);
fclose(oup);
return 0;

我得到的结果是:

    -28083683309813134333858080554409220100578902032859386180468433149049781495379346137536863936326139303879846829175766826833343673613788446579155215033623707200818670767132304934425064429529496303287641688697019947073799877821581901737052884168025721481955133510652655692037990001524306465271815108431928360960.000000
0.000000
0.000000
0.000000
0.000000
0.000000
-20701636078248669570005757343846586744027511881225108933223144646890577802102653022204406730988428912367583701134782419138464527797567258583836429190479797597328678189654150340845........................................................................

我的目标是获得这些值(value):

  -1.0162354e-02
-9.3688965e-03
-7.5073242e-03
-1.9531250e-03
3.7231445e-03
1.3549805e-02
2.3223877e-02
3.2867432e-02
4.4830322e-02
5.5114746e-02
6.7291260e-02
7.7636719e-02
8.8562012e-02
9.5794678e-02
1.0055542e-01
1.0415649e-01
1.0351563e-01
1.0235596e-01
9.8785400e-02
9.1796875e-02
8.3648682e-02
7.1594238e-02

音频文件是单声道的,分辨率是 16 位,知道如何解决这个问题吗?感谢您的帮助

最佳答案

对于初学者,您必须以二进制模式打开文件。否则你会得到文本模式,例如,它可以翻译行尾。不适用于二进制数据。

二进制模式:

inp = fopen("M0.raw", "rb");
^
|
muy
importante

关于c - 像 Matlab 在 C 中那样读取原始音频文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24629845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com