This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/TMS320C5505:如何将.csv 文件转换为.wav 文件

Guru**** 2193075 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/943710/compiler-tms320c5505-how-to-convert-a-csv-file-to-a-wav-file

器件型号:TMS320C5505

工具/软件:TI C/C++编译器

我已经将一个.PCM 文件转换为一个.wav 文件并知道它的声音。 将.PCM 文件转换为.csv 文件并读取.csv 文件的图形以表示声音文件的声音幅度后、我现在尝试了解如何输入.csv 文件、 然后输出.wav 文件并查看它是否听起来相同。 但是、每次我使用 Code Composer Studio v.10调试程序时、它都会跳过 while 循环。 是否有人看到我的代码中的错误位置以及我缺少的内容? 基本上、我对.PCM 至.csv 和.PCM 至.wav 转换使用了相同的代码、只是我切换了文件路径、但它不起作用。 如果有任何帮助,我会非常感激…

下面是我的代码...

--------------------------------------------------------------------

/*
* fileIOTest.c
*
*创建日期:2012年3月10日
*作者:BLEE
*
*对于"实时数字信号处理:
*基础知识、实施和应用、第三版"
*作者:Sen M. Kuo、Bob H. Lee 和 Wenshun Tian
*出版商:John Wiley and Sons、Ltd
*

#include
#include
#include "tidtypes.h"

uint8 waveHeader[44]={// WAV 文件头的44字节
0x52、0x49、0x46、0x46、0x00、 0x00、0x00、0x00、
0x57、0x41、0x56、0x45、0x66、 0x6D、0x74、0x20、
0x10、0x00、0x00、0x00、0x01、 0x00、0x01、0x00、
0x40、0x1F、0x00、0x00、0x80、 0x3E、0x00、0x00、
0x02、0x00、0x10、0x00、0x64、 0x61、0x74、0x61、
0x00、0x00、0x00、0x00};

#define 大小1024
uint8 ch[size];//声明实验的 char[1024]数组

void main()

文件*FP1,*FP2;//文件指针
uint32 i;
//unsigned int j;//用作计数器的 unsigned long 整数

printf ("Exp. 1.2 --文件 io\n");

FP1 = fopen ("E:\\Code Composer Studio Workspace\\EE489\\Lab1_FileIO_1_\out.xlsx"、"rb");//打开输入文件
//fp1 = fopen ("..\\.cproject"、"rb");//打开输入文件
fp2 = fopen ("E:\\Code Composer Studio Workspace\\EE489\\Lab1_FileIO_1\\output\\C55DSPUSBStickAudioTest.wav"、"WB");//打开输出文件

如果(FP1 =NULL)//检查输入文件是否存在

printf ("打开输入文件'out.xlsx'\n"\n 失败);
EXIT (0);

fseek (fp2、44、0);//高级输出文件点44字节
I=0;

while (fread (ch、sizeof (UINT8)、size、FP1)=size)//以输入数据字节的大小读取

// fread (ch、sizeof (uint8)、size、fp1);
// j++;
fwrite (ch、sizeof (UINT8)、size、fP2);//将数据字节的大小写入输出文件
//fwrite (ch、sizeof (UINT8)、size、FP3);//将数据字节的大小写入输出文件
i +=大小;
printf ("%ld 字节已处理\n"、i);//显示已处理的数据数


waveHeader[40]=(uint8)(I&0xff);//将 size 参数更新为 WAV 标题
waveHeader[41]=(uint8)(i>>8)&0xff;
waveHeader[42]=(uint8)(I>>16)&0xff;
waveHeader[43]=(uint8)(i>>24)&0xff;
WaveHeader[4]= waveHeader[40];
WaveHeader[5]= waveHeader[41];
WaveHeader[6]= waveHeader[42];
WaveHeader[7]= waveHeader[43];

回卷(FP2);//将输出文件点调整为开始
fwrite (waveHeader、sizeof (UINT8)、44、FP2);//将44字节 WAV 报头写入输出文件

fclose (FP1);//关闭输入文件
fclose (FP2);//关闭输出文件

printf ("\nExp --已完成\n");

--------------------------------------------------------------------

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我怀疑 C I/O 函数(printffopen 等)有问题  请告诉我文章 使用 printf 的提示是否 解决了问题。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如前所述、它仅跳过 while 循环、条件是它读取的输入为1024字节。 因此、它可能与 while 环路有关

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    while 循环由对 fread 的调用是否成功控制。  它必须在第一次调用时失败。  为什么失败?  先前的 fseek 是否也失败?

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    显然,由于 fread()没有在每8个位块中采用1024的无符号整数,因此无法读取。 不过、这会让我进入死区;while 循环在读取.PCM 文件并将其转换为.xlsx 和.wav 文件时成功、但另一方面、它仍然失败。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我仍然认为 使用 printf 的提示之一 可能会有所帮助。  您可能已经在所有程序中溢出了堆栈、但到目前为止、它还没有失败。

    谢谢、此致、

    乔治

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我对我的代码进行了更新。 我添加了 fscanf()函数,以便程序读取包含输入文件.csv 文件的文件路径。 但是、它在第49行停止、需要我的用户输入。 我输入的内容到底是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我现在注意到您的代码中出现了这个问题...

    [引用用户="Eric Graham "]

    fp2 = fopen ("E:\\Code Composer Studio Workspace\\EE489\\Lab1_FileIO_1\\output\\C55DSPUSBStickAudioTest.wav"、"WB");//打开输出文件

    如果(FP1 =NULL)//检查输入文件是否存在

    [/报价]

    fopen 会分配给 FP2、但 FP1会检查为 NULL。  您需要检查 FP2是否为 NULL

    很抱歉、我没有早点注意到这一点。

    谢谢、此致、

    乔治