音频通过CAN FD进入耳机
Audio through CAN FD into headphones
我正在尝试使用 12 位分辨率的 ADC 录制音频,获取样本缓冲区并通过 CAN FD 将其发送到另一个设备,该设备获取此音频的样本并创建 .wav
并播放它。问题是我看到麦克风的数据通过 CAN FD 发送到其他设备,但我无法将此数据正确转换为 .wav
文件并通过麦克风听到我说的话。我只听到嘟嘟声。
我正在创建一个新的 .wav
每 4 条 CAN FD 消息,以便进行某种实时通信并减少延迟,但我认为这是不可能的,或者如果我正在考虑正确的方法。
在此线程中,我获取 CAN FD 发送的消息并将其连接到缓冲区中,以便将其引入 .wav
文件中。我尝试了更大的缓冲区,但它并没有改变结果。
我怎样才能从 CAN FD 获取数据并听到它?
澄清:我知道使用CAN FD传输音频不是正确的方法,但它是一个主项目。
struct canfd_frame frame;
CAN_MSG msg;
int trama_can[72];
int nbytes;
while (status_libreria == 0)
;
unsigned char buffer[256];
// FILE * fPtr;
int i=0,x=0;
//fPtr = fopen("Test.txt", "w");
while (1) {
do {
nbytes = read(s, &frame, sizeof(struct canfd_frame));
} while (nbytes == 0);
msg.id.ext = frame.can_id;
msg.dlc = frame.len;
if (msg.dlc > 8)
msg.dlc = 8; //Protecci�n hasta adaptar AC3LIB a CANFD
Numas_memcpy(&(msg.data.bdata), &(frame.data), msg.dlc);
can_frame_2_ac3lib(&msg, BUS_VERTICAL);
for(x=0;x<64;x++) buffer[i*64+x] = frame.data[x];
printf("%d \r\n",frame.data[x]);
printf("i:%d \r\n",i);
// Copiar datos a fichero.wav y reproducirlo simultaneamente
if (i == 3) {
printf("Datos IN\r\n");
write_wav("prueba.wav",256 , (short int *)buffer, 16000);
//fwrite(buffer,1,sizeof(buffer),fPtr);
//fclose(fPtr);
system("aplay prueba.wav -f cd");
i = 0;
system("rm prueba.wav");
}
i++;
}
32 first bytes of the audio file being recorded
图中可以看到,正在记录数据。而且,这个数据和ADC里面的数据是一样的,但是我播放的时候,只听到噪音。
先把问题简单化。确保您可以首先以低速率将已知数据从一端传输到另一端。我相信下面的建议听起来太微不足道了。但是,在您完全有信心了解所有内容之前,我预计您仍然会遇到很多困难。
慢 - 每秒一帧,甚至更慢。
- 学习从一端向另一端发送一个 0x55 字节并在接收方验证。
- 学习一帧发送几个0x55并验证。
- 学习发送 0x12345678 - 验证它在另一端以正确顺序的字节结尾
- 学习发送计数器。在接收器检查它,确保你没有丢失任何数据。
现在再做一遍,但速度提高 10 倍。
继续,直到您能够以音频所需速率的 10 倍发送计数器,而不会丢掉任何帧,持续数分钟,然后数小时。
对系统的其余部分施加压力,以确保它在压力下仍能正常工作。
只有现在,你才能开始学习发送音频。
相信我,你会学到很多东西!
我正在尝试使用 12 位分辨率的 ADC 录制音频,获取样本缓冲区并通过 CAN FD 将其发送到另一个设备,该设备获取此音频的样本并创建 .wav
并播放它。问题是我看到麦克风的数据通过 CAN FD 发送到其他设备,但我无法将此数据正确转换为 .wav
文件并通过麦克风听到我说的话。我只听到嘟嘟声。
我正在创建一个新的 .wav
每 4 条 CAN FD 消息,以便进行某种实时通信并减少延迟,但我认为这是不可能的,或者如果我正在考虑正确的方法。
在此线程中,我获取 CAN FD 发送的消息并将其连接到缓冲区中,以便将其引入 .wav
文件中。我尝试了更大的缓冲区,但它并没有改变结果。
我怎样才能从 CAN FD 获取数据并听到它?
澄清:我知道使用CAN FD传输音频不是正确的方法,但它是一个主项目。
struct canfd_frame frame;
CAN_MSG msg;
int trama_can[72];
int nbytes;
while (status_libreria == 0)
;
unsigned char buffer[256];
// FILE * fPtr;
int i=0,x=0;
//fPtr = fopen("Test.txt", "w");
while (1) {
do {
nbytes = read(s, &frame, sizeof(struct canfd_frame));
} while (nbytes == 0);
msg.id.ext = frame.can_id;
msg.dlc = frame.len;
if (msg.dlc > 8)
msg.dlc = 8; //Protecci�n hasta adaptar AC3LIB a CANFD
Numas_memcpy(&(msg.data.bdata), &(frame.data), msg.dlc);
can_frame_2_ac3lib(&msg, BUS_VERTICAL);
for(x=0;x<64;x++) buffer[i*64+x] = frame.data[x];
printf("%d \r\n",frame.data[x]);
printf("i:%d \r\n",i);
// Copiar datos a fichero.wav y reproducirlo simultaneamente
if (i == 3) {
printf("Datos IN\r\n");
write_wav("prueba.wav",256 , (short int *)buffer, 16000);
//fwrite(buffer,1,sizeof(buffer),fPtr);
//fclose(fPtr);
system("aplay prueba.wav -f cd");
i = 0;
system("rm prueba.wav");
}
i++;
}
32 first bytes of the audio file being recorded
图中可以看到,正在记录数据。而且,这个数据和ADC里面的数据是一样的,但是我播放的时候,只听到噪音。
先把问题简单化。确保您可以首先以低速率将已知数据从一端传输到另一端。我相信下面的建议听起来太微不足道了。但是,在您完全有信心了解所有内容之前,我预计您仍然会遇到很多困难。
慢 - 每秒一帧,甚至更慢。
- 学习从一端向另一端发送一个 0x55 字节并在接收方验证。
- 学习一帧发送几个0x55并验证。
- 学习发送 0x12345678 - 验证它在另一端以正确顺序的字节结尾
- 学习发送计数器。在接收器检查它,确保你没有丢失任何数据。
现在再做一遍,但速度提高 10 倍。
继续,直到您能够以音频所需速率的 10 倍发送计数器,而不会丢掉任何帧,持续数分钟,然后数小时。
对系统的其余部分施加压力,以确保它在压力下仍能正常工作。
只有现在,你才能开始学习发送音频。
相信我,你会学到很多东西!