搜索
bottom↓
回复: 17

怎样把串口接收到的波形数据在电脑上变换成声音播放?

[复制链接]

出0入8汤圆

发表于 2022-8-26 11:08:29 | 显示全部楼层 |阅读模式
如题,用音频采集模块采集的声音传给pc,播放一下声音确认一下采集效果。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入442汤圆

发表于 2022-8-26 11:52:13 来自手机 | 显示全部楼层
matlab按pcm直接播放,或者用其它pcm工具直接播放,或者转成wav格式播放。

出40入518汤圆

发表于 2022-8-26 11:52:45 | 显示全部楼层
不需要实时吧?转换成wav格式吧。网上找下wav格式头,然后填充pcm数据,最后保存成文件再播放。我以前写过一个C#自己生成正弦波wav文件的,可以找下给你

出0入8汤圆

 楼主| 发表于 2022-8-26 12:19:26 来自手机 | 显示全部楼层
智涅 发表于 2022-8-26 11:52
不需要实时吧?转换成wav格式吧。网上找下wav格式头,然后填充pcm数据,最后保存成文件再播放。我以前写过 ...
(引用自3楼)

多谢了。

出0入8汤圆

 楼主| 发表于 2022-8-26 12:20:29 来自手机 | 显示全部楼层
wye11083 发表于 2022-8-26 11:52
matlab按pcm直接播放,或者用其它pcm工具直接播放,或者转成wav格式播放。
(引用自2楼)

matlab太大。pcm工具有好用的推荐么

出40入518汤圆

发表于 2022-8-26 12:57:56 | 显示全部楼层
private void CreatWav(string path, byte[] data, int DataCount)
        {
            int[] BinData = new int[DataCount * 8];
            int LastBit = 1;
            int Binary_Index = 0;
            for (int i = 0; i < data.Length; i++)
            {
                for (int j = 0; j < 8; j++)
                {
                    if (((data[i] >> (7 - j)) & 0x01) == LastBit)
                        BinData[Binary_Index]++;
                    else
                    {
                        if (LastBit == 1)
                            LastBit = 0;
                        else
                            LastBit = 1;
                        Binary_Index++;
                        BinData[Binary_Index] = 1;
                    }
                }
            }

            int BitLen = SampleRate / BitRate;//每一位的样本数44100/16=2756


            FileStream FS = new FileStream(path, FileMode.Create);
            byte[] Head1 = { 0x52, 0x49, 0x46, 0x46 };
            FS.Write(Head1, 0, 4);
            int len = (int)(SampleRate * 2 * 1 / BitRate * 8) * DataCount;//8是1byte对应8bits
            len += 46;
            byte[] Bytelen = { 0x52, 0x49, 0x46, 0x46 };
            Bytelen[0] = (byte)(len % 256);
            Bytelen[1] = (byte)(len % 65535 / 256);
            Bytelen[2] = (byte)(len % 16777215 / 65535);
            Bytelen[3] = (byte)(len / 16777215);
            FS.Write(Bytelen, 0, 4);
            byte[] HeadData = {
                0x57,0x41,0x56,0x45,//“WAVA”
                0x66,0x6d,0x74,0x20,//“fmt ”
                0x12,0x00,0x00,0x00,//过滤字节,一般为10H
                0x01,0x00,//格式种类,1为PCM
                0x01,0x00,//通道,单声道
                0x44,0xac,0x00,0x00,//采样率,22050   8K:401f  44100:44ac
                0x88,0x58,0x01,0x00,//每秒数据量(单位bytes),44100   16k
                0x02,0x00,//Data的数据块长度
                0x10,0x00,//数据位数:16bit
                0x00,0x00,
                0x66,0x61,0x63,0x74,//"fact"
                0x04,0x00,0x00,0x00,0xf8,0x2f,0x14,0x00,//这个加了才行,跟网站说明不一样
                0x64,0x61,0x74,0x61//Data
            };
            FS.Write(HeadData, 0, HeadData.Length);
            len -= 46;
            Bytelen[0] = (byte)(len % 256);
            Bytelen[1] = (byte)(len % 65535 / 256);
            Bytelen[2] = (byte)(len % 16777215 / 65535);
            Bytelen[3] = (byte)(len / 16777215);
            FS.Write(Bytelen, 0, 4);

            byte[] SinBit1;
            byte[] SinBit0;
            Int16 Value;
            for (int count = 0; count < BinData.Length; count++)
            {
                if (count % 2 == 0)
                {
                    SinBit1 = new byte[BinData[count] * BitLen * 2];
                    for (int i = 0; i < SinBit1.Length / 2; i++)
                    {
                       if (i < Changing_Value)
                            Value = (short)(32767 * i / Changing_Value * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
                        else if (i > SinBit1.Length / 2 - ZeroBitWidth)
                            Value = 0;
                        else if (i > SinBit1.Length / 2 - Changing_Value - ZeroBitWidth)
                            Value = (short)(32767 * (SinBit1.Length / 2 - i - ZeroBitWidth) / Changing_Value * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
                        else
                            Value = (short)(32767 * Math.Sin(FREQ1 * 2 * Math.PI * i / SampleRate));
                        SinBit1[2 * i] = (byte)Value;
                        SinBit1[2 * i + 1] = (byte)(Value >> 8);


                    }
                    FS.Write(SinBit1, 0, SinBit1.Length);
                }
                else
                {
                    SinBit0 = new byte[BinData[count] * BitLen * 2];
                    for (int i = 0; i < SinBit0.Length / 2; i++)
                    {
                       if (i < Changing_Value)
                            Value = (short)(32767 * i / Changing_Value * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
                        else if (i > SinBit0.Length / 2 - ZeroBitWidth)
                            Value = 0;
                        else if(i > SinBit0.Length / 2 - Changing_Value - ZeroBitWidth)
                            Value = (short)(32767 * (SinBit0.Length / 2 - i - ZeroBitWidth) / Changing_Value * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
                        else
                            Value = (short)(32767 * Math.Sin(FREQ0 * 2 * Math.PI * i / SampleRate));
                        SinBit0[2 * i] = (byte)Value;
                        SinBit0[2 * i + 1] = (byte)(Value >> 8);
                    }
                    FS.Write(SinBit0, 0, SinBit0.Length);
                }

            }
            FS.Close();
        }

中间那部分的数据你要自己改,我这里是做了fsk信号调制的。你主要看文件头,然后写你的内容,保存文件就好了

出0入17汤圆

发表于 2022-8-26 14:14:51 | 显示全部楼层
使用Cool Edit PRO,可以播放PCM

出0入8汤圆

 楼主| 发表于 2022-8-26 14:44:11 | 显示全部楼层
think_a_second 发表于 2022-8-26 14:14
使用Cool Edit PRO,可以播放PCM
(引用自7楼)

1869
9224
2742
11732
-166
1078
-6599
1877
-11198
-583
-15978
1687
-5689
-3024
-4578
-2724
-9354
-12273
-13353
-5922
9320
5878
11798
12882
17975
-1538
1274
-8867
2149
-15
-7615
-3837
-7542
4195
-9254
3374


这种字节流粘贴进去就可以放?

出200入2554汤圆

发表于 2022-8-26 15:51:23 | 显示全部楼层
Goldwave 不考虑下?

啥头都不用加,直接 8bit/16bit 二进制文件就能放。指定好数据格式、采样率:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

 楼主| 发表于 2022-8-26 16:09:25 | 显示全部楼层
t3486784401 发表于 2022-8-26 15:51
Goldwave 不考虑下?

啥头都不用加,直接 8bit/16bit 二进制文件就能放。指定好数据格式、采样率:
(引用自9楼)



这种格式的的txt文件能播放么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入17汤圆

发表于 2022-8-26 16:21:25 | 显示全部楼层
justdomyself 发表于 2022-8-26 14:44
1869
9224
2742
(引用自8楼)

像9楼的软件一样,要二进制文件,字符串是不可以的,在电脑收到数据后保存后二进制就可以。看你的数据是16位的。

出0入8汤圆

 楼主| 发表于 2022-8-26 16:23:07 | 显示全部楼层
think_a_second 发表于 2022-8-26 16:21
像9楼的软件一样,要二进制文件,字符串是不可以的,在电脑收到数据后保存后二进制就可以。看你的数据是1 ...
(引用自11楼)


不是16位的,是24位的。INMP441读取出来的,而且最高位是符号位,代表正负,上面是按照字符串的形式打印出来的。

出200入2554汤圆

发表于 2022-8-26 16:51:36 来自手机 | 显示全部楼层
justdomyself 发表于 2022-8-26 16:23
不是16位的,是24位的。INMP441读取出来的,而且最高位是符号位,代表正负,上面是按照字符串的形式打印 ...
(引用自12楼)

你需要先转成二进制的。
就算是24位,最差扩充到32位也就能兼容了

出0入12汤圆

发表于 2022-8-26 16:55:33 来自手机 | 显示全部楼层
python 可以做到,我用算出来的数,不用文件,记得只靠好像是数组一样的结构,直接实时放出来,还能显示波形。几年过去,对python一点也不会了。

出0入1119汤圆

发表于 2022-8-26 16:56:22 | 显示全部楼层
本帖最后由 Himem 于 2022-8-26 16:59 编辑
t3486784401 发表于 2022-8-26 16:51
你需要先转成二进制的。
就算是24位,最差扩充到32位也就能兼容了
(引用自13楼)


goldwave可以放txt的
  1. [ASCII 44100Hz, Channels: 1, Samples: 441000, Flags: 3]
  2. 1869
  3. 9224
  4. 2742
  5. 11732
  6. -166
  7. 1078
  8. -6599
复制代码

类似这样加个头就行
当然打开后要先"最佳化音量"

出0入8汤圆

 楼主| 发表于 2022-8-27 00:45:33 | 显示全部楼层
Himem 发表于 2022-8-26 16:56
goldwave可以放txt的

类似这样加个头就行
(引用自15楼)

好东西,flags  是啥?

出0入1119汤圆

发表于 2022-8-27 00:56:44 | 显示全部楼层
本帖最后由 Himem 于 2022-8-27 00:58 编辑
justdomyself 发表于 2022-8-27 00:45
好东西,flags  是啥?
(引用自16楼)

值域
0 float
1 sint16
2 double
3 sint24

出0入8汤圆

 楼主| 发表于 2022-8-27 01:07:25 | 显示全部楼层
本帖最后由 justdomyself 于 2022-8-27 01:10 编辑
Himem 发表于 2022-8-27 00:56
值域
0 float
1 sint16
(引用自17楼)


Samples  是采样点个数?


没找到"最佳化音量"这个按钮,只看到了最大化音量
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-16 00:18

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表