fscanf (filepointer, "%d\n%lg\n", sig_length, sample_rate);如何解释它?

Posted

技术标签:

【中文标题】fscanf (filepointer, "%d\\n%lg\\n", sig_length, sample_rate);如何解释它?【英文标题】:fscanf (filepointer, "%d\n%lg\n", sig_length, sample_rate); how to interpret it?fscanf (filepointer, "%d\n%lg\n", sig_length, sample_rate);如何解释它? 【发布时间】:2016-04-17 10:59:40 【问题描述】:

我有一个从互联网之前存在的科学音频文件类型(称为 TFD v1)的音频格式转换,一个未压缩简单的简单原始样本值数组...在this page 上的 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 */

【问题讨论】:

嗨 Peter K,在该复杂代码的 1000 行中,这是我唯一遇到问题的行...这是原始代码的逐字复制粘贴,减去条件另一种文件类型。为什么否认它是您的代码,好像不是:)...我只是将 fsam 重新标记为 SRate_float 以简化问题并说明 fsam 是浮点采样率。您肯定认识并理解您的 fscanf 功能吗?以前我被要求在 DSP 论坛中包含一个问题的代码,现在我被告知 DSP 论坛不适合 DSP 代码......如果你能花一点时间来启发我,我不担心。 抱歉造成误会。我之前在堆栈交换上试过这个问题:什么是...... fscanf (filepointer, "%d\n%lg\n", sig_length, fsam);受访者说代码不可解释,他们不知道原始音频或 TFD1 文件是什么,我应该找出来,否则他们无能为力(什么是原始音频文件?天哪,谢谢堆栈伙伴)。看到您研究过 TFD 并编写了 fscanf 子句,请用数字说明 fscanf 返回什么数组? 避免屈尊俯就,与通才相比,您会惊讶于您的专业研究的局限性。以前对您的代码发表意见的 C 权威说:K&R 函数声明已经消失了四分之一个多世纪和三个 ISO C 标准。另外,不测试 fscanf 返回值肯定会带来惊喜。 – Jens...他无法回答我的菜鸟问题。 :-) 很好,代码是在 27 年前编写的。 我认为采样率和 fsam 函数有问题的原因是我从你的代码中得到了令人印象深刻的图表,尽管 22kHz (sample[i]=sin(i/ 2); ) 信号仅在图表最高值的 1/6 处达到峰值,就好像它基于 192k 采样率一样,而 1khz 以下的频率到达返回图表的最低值之上和之下,这就是为什么我的采样率一定有错误。 【参考方案1】:

fscanf (filepointer, "%d\n%lg\n", sig_length, fsam);调用C函数fscanf,根据格式字符串从文件中读取格式化数据。

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

例如,使用现代采样率:

1
256
44100.0
1.0
0.98
0.96
...

其中第一行是 sigtype,第二行和第三行是信号长度(以样本为单位)和采样率,其余行是信号值。

【讨论】:

这对我来说是个问题,因为用户输入采样率作为运行执行参数以从命令提示符运行代码,并且该值用作读取音频文件的变量。 Converseley,上面的示例提供了文件指定的采样率,这使得原始命令行对采样率的争论变得多余? ...哦,好的,我明白了,这是使用 fscanf 子句读取数组后的内容。谢谢!这仍然给我留下了麻烦,音频数组随后被发送到 FFT 并且它没有任何 1,256,44100.0 类型的标头?!?

以上是关于fscanf (filepointer, "%d\n%lg\n", sig_length, sample_rate);如何解释它?的主要内容,如果未能解决你的问题,请参考以下文章

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

转: fscanf()函数详解

如何让fscanf自动在文件读结束时候停止执行