Audio fscanf(文件指针,";%d\n%lg\n";,信号长度,采样率);如何解读?

Audio fscanf(文件指针,";%d\n%lg\n";,信号长度,采样率);如何解读?,audio,signals,time-frequency,c,Audio,Signals,Time Frequency,C,我有一个音频格式转换,它来自互联网之前存在的一个科学音频文件类型(称为TFD v1),一个简单的原始样本值数组。。。在上的get_signal()函数中,我不知道采样值是如何格式化的,为什么需要采样率从数组中读取256个点 fscanf (filepointer , "%d\n%lg\n" , sig_length, fsam ); fscanf (raw_audio_array_file, ?? , 256 , SRat

我有一个音频格式转换,它来自互联网之前存在的一个科学音频文件类型(称为TFD v1),一个简单的原始样本值数组。。。在上的get_signal()函数中,我不知道采样值是如何格式化的,为什么需要采样率从数组中读取256个点

  fscanf (filepointer         , "%d\n%lg\n" , sig_length,  fsam         );
  fscanf (raw_audio_array_file,     ??      ,     256   ,  SRate_Float  );


    /*******************************************************
    * function get_signal reads signal data into sig_re from
    * the file pointed to by filepointer. If the file is a
    * type 2 TFD file then the imaginary part is set too.
    * If the signal is type 1, its hilbert transform is
    * returned in the imaginary part (sig_im).
    ********************************************************/


    void    get_signal (filepointer, sig_re, sig_im, fsam, sig_length)
        FILE   *filepointer;
        double  sig_re[],
                sig_im[],
               *fsam;
        int    *sig_length;

    {
        register int i; /* counter variable */
        int     sigtype; /* data file type */
        double  dummy1,
                dummy2; /* dummy temporary variables */


        fscanf (filepointer, "%d\n", &sigtype);
        if (sigtype == 1) { /* Type one TFD file */
     fscanf (filepointer, "%d\n%lg\n", sig_length, fsam);
     for (i = 0; i < *sig_length; i++) {
         fscanf (filepointer, "%lg\n", &sig_re[i]);
     }
     analytic (sig_re, sig_im, *sig_length);
        }
        else {
     if (sigtype == 2) { /* Type 2 TFD file */
         fprintf(stderr,"Complex signal.\n");    
         fscanf (filepointer, "%d\n%lg\n", sig_length, fsam);
         for (i = 0; i < *sig_length; i++) {
     fscanf (filepointer, "(%lg,%lg)\n", &sig_re[i], &sig_im[i]);
     printf("%lg\n",sig_re[i]);     
         }
     }
     else {
         fprintf (stderr, "ccg : incorrect input format.\n");
         exit (7);
     }
     fclose (filepointer);
        }
    } /* END OF FUNCTION get_signal */
fscanf(文件指针,“%d\n%lg\n”,信号长度,fsam);
fscanf(原始音频阵列文件,256,SRate浮点);
/*******************************************************
*函数get_signal将信号数据从
*filepointer指向的文件。如果文件是
*输入2 TFD文件,然后设置虚部。
*如果信号类型为1,则其希尔伯特变换为
*返回虚部(sig_im)。
********************************************************/
无效获取信号(文件指针、信号重、信号im、fsam、信号长度)
文件*文件指针;
双信号重复[],
sig_im[],
*fsam;
int*sig_长度;
{
寄存器int i;/*计数器变量*/
int sigtype;/*数据文件类型*/
双dummy1,
dummy2;/*伪临时变量*/
fscanf(文件指针、%d\n、&sigtype);
如果(sigtype==1){/*则键入一个TFD文件*/
fscanf(文件指针,“%d\n%lg\n”,信号长度,fsam);
对于(i=0;i<*sig_长度;i++){
fscanf(文件指针、%lg\n、&sig_re[i]);
}
分析(sig_re,sig_im,*sig_长度);
}
否则{
如果(sigtype==2){/*type2TFD文件*/
fprintf(stderr,“复数信号”。\n”);
fscanf(文件指针,“%d\n%lg\n”,信号长度,fsam);
对于(i=0;i<*sig_长度;i++){
fscanf(文件指针,(%lg,%lg)\n“,&sig_re[i],&sig_im[i]);
printf(“%lg\n”,符号[i]);
}
}
否则{
fprintf(标准,“ccg:输入格式不正确。\n”);
出口(7);
}
fclose(文件指针);
}
}/*功能结束获取信号*/
fscanf(文件指针,“%d\n%lg\n”,信号长度,fsam)
调用C函数,该函数根据格式字符串从文件中读取格式化数据

本例中的格式字符串是
%d\n%lg\n“
,它分解为
%d
(一个整数)、一个换行符、
%lg
(一个
双精度
)和另一个换行符。所以,基本上,它从文件中读取两行,第一行应该包含一个带采样长度的整数,第二行包含采样率

例如,使用现代采样率:

1
256
44100.0
1.0
0.98
0.96
...

其中第一行是sigtype,第二行和第三行是信号长度(采样数)和采样率,其余的行是信号值。

Hi Peter K,在该复杂代码的1000行中,这是我遇到的唯一一行。。。它是原始代码的逐字复制粘贴,减去其他文件类型的条件。为什么要否认它是您的代码,就好像它不是:)。。。我只是将fsam重新标记为SRate_float,以简化问题,并说明fsam是浮动采样率。您肯定认识并理解您的fscanf功能吗?以前我被要求在DSP论坛中包含一个问题的代码,现在我被告知DSP论坛不支持DSP代码。。。如果你能花一分钟时间来启发我,我不担心。对不起,误会了。我以前在堆栈交换上尝试过这个问题:什么是。。。。。。fscanf(文件指针,“%d\n%lg\n”,信号长度,fsam);响应者说代码是不可解释的,他们不知道什么是原始音频或TFD1文件,我应该知道,否则他们帮不上忙(什么是原始音频文件?天啊,感谢stack buddies)。当你学习TFD并编写fscanf子句时,请用数字来说明fscanf返回的数组。避免屈尊俯就,与通才相比,你会惊讶于专业研究的局限性。以前的C权威对您的代码发表了意见,他说:K&R函数声明已经消失了四分之一个多世纪,三个ISO C标准也消失了。另外,不测试fscanf返回值肯定会带来惊喜延斯。。。他不能回答我的noob问题:-)很好,代码是27年前写的。我认为采样率和fsam函数有问题的原因是我从你的代码中得到了令人印象深刻的图形,尽管22kHz(样本[i]=sin(i/2);)信号仅在图的最高值的1/6处达到峰值,就好像它是基于192k采样率,而低于1khz的频率到达并低于返回图的最低值,这就是为什么我认为采样率一定有错误。这对我来说是个问题,因为用户输入采样率作为运行执行参数,以从命令提示符运行代码,并且该值用作读取音频文件的变量。相反,上面的示例提供了文件指定的采样率,这使得采样率的原始命令行参数是冗余的。。。哦,好的,我明白了,这是数组的内容,在使用fscanf子句读取之后。谢谢这仍然给我留下了一个麻烦,音频阵列被发送到FFT,并且它没有任何类型为125644100.0的头?!?