yangjking

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking  发布于  2016-10-29 19:41:23
采纳率 0%
8个问答
6081

3516a+外部auido codec输出语音有很大的噪声

 
大家好,

最近在用3516a+外接audio codec做音频功能。
我的外接audio codec包括声音采集和扬声器播放两部分。
如果如图,让声音采集和扬声器通过i2s直连。声音是可以正常被播放的。

-------------------  i2s 输出       i2s输入    --------------------------
| 声音采集soc | ---------------------------->| 扬声器播放soc    |
-------------------                                  --------------------------

现在就是在它们之间加个3516a
----------------i2s输出       -----------i2s输出  -------------------
声音采集soc|------------->| 3516a |-------->| 扬声器soc     |
----------------                 -----------            --------------------
这播放出来的声音背景噪音就很大。
使用的是mpp里的sample_audio,使用AiAo例子。
其中audio codec的传输参数如下:

代码初始化参数如下
        stAiAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;
        stAiAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
        stAiAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
        stAiAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
        stAiAttr.u32EXFlag = 0;
        stAiAttr.u32FrmNum = 30;
        stAiAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
        stAiAttr.u32ChnCnt = 1;
        stAiAttr.u32ClkSel = 0;
并且由于codec是一周期传输64bit,我发现它的bclk为1M,fs为16K,所以对应还重新设置过时钟分频寄存器
        do_system("himm 0x20650100 0xe1f4b");
        do_system("himm 0x20650104 0xcd35");
        do_system("himm 0x2065002c 0x76543210");
       do_system("himm 0x20650144 0xc135");
使他们频率保持一致。
不知道大家有没有碰见过,加上hisi芯片后,声音背景噪音很大的问题。

谢谢
我来回答
回答20个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 08:00:33
认可0
不太明白楼主, 在代码里面放一堆himm是什么想法

难道,不用这些himm声音有问题? 如果有,是什么表现情况?

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 08:57:24
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40496&ptid=13186]zhuangweiye 发表于 2016-10-31 08:00[/url]
不太明白楼主, 在代码里面放一堆himm是什么想法

难道,不用这些himm声音有问题? 如果有,是什么表现情况?
...[/quote]

hi zhuangweiye,
是这样的。由于我音频采集soc的i2s输出的参数如图所示,虽然它也是16K采样率,16bit的采样宽度。但是由于它定义了在一个采样周期内有64个bit。我量了它的波形,发现其bclk上频率为1M,ws_line的频率为16K。而当在调用hisi的API不做寄存器修改的话,设置16K采样率和16bit采样宽度,只会得到bclk线上示波器显示500KHz,ws_line上为16KHz。
结果就是不会有声音输出。后来我就只能用himm来设置时钟分频寄存器,来使得hisi的i2s的bclk输出1MHz,ws_line为16KHz,以达到一个周期内采64bit。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 09:11:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40501&ptid=13186]yangjking 发表于 2016-10-31 08:57[/url]
hi zhuangweiye,
是这样的。由于我音频采集soc的i2s输出的参数如图所示,虽然它也是16K采样率,16bit的 ...[/quote]

感觉这样修改应该是有点问题

楼主的A/D是固定模式, 那么可以设置stAiAttr.u32ChnCnt 来调整, 比如为2或者4

而ai channel还是开一个

另外, 关于噪声, 楼主要先存文件, 放到PC上播放,看看噪声是采集还是播放带来的

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 10:52:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40503&ptid=13186]zhuangweiye 发表于 2016-10-31 09:11[/url]
感觉这样修改应该是有点问题

楼主的A/D是固定模式, 那么可以设置stAiAttr.u32ChnCnt 来调整, 比如为 ...[/quote]

Hi zhuangweiye,
感谢您的回复,你的意思是stAiAttr.enSoundmode = AUDIO_SOUND_MODE_MONO还是这样设置,但是stAiAttr.u32ChnCnt = 2或4这样吗?话说回来海思平台上面考虑左右对齐left justified, right justified这一说法吗?还有delay 为0这种设置。好像在那些api里也没找到关于这个的。
另外由于我要独立使用i2s的主从模式,所以在我的海思设置里Ai是为从,Ao是为主,所以Ai用的是时钟设置寄存器00,Ao用的是时钟寄存器88,这个应该可以吧?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 11:01:46
认可0
本帖最后由 zhuangweiye 于 2016-10-31 11:02 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=40524&ptid=13186]yangjking 发表于 2016-10-31 10:52[/url]
Hi zhuangweiye,
感谢您的回复,你的意思是stAiAttr.enSoundmode = AUDIO_SOUND_MODE_MONO还是这样设置 ...[/quote]

1. 其他都不改, 只改stAiAttr.u32ChnCnt = 2或4, 这样来匹配A/D过来的数据(这A/D估计是低端, i2s都是固定)
   当然这个是我个人的猜测, 能不能行要试过才知道

2. 关于i2s, Ai是从, Ao是主, 这个没问题, 前提是用两组i2S,

另外不用费心去设寄存器, 海思做的不错, 没有特别的需求, 直接API就可以了

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 11:29:05
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40527&ptid=13186]zhuangweiye 发表于 2016-10-31 11:01[/url]
1. 其他都不改, 只改stAiAttr.u32ChnCnt = 2或4, 这样来匹配A/D过来的数据(这A/D估计是低端, i2s都是固 ...[/quote]

Hi
1. 设置Ai没有报错,在设置Ao的时候报错了。
代码是:
    AIO_ATTR_S stAiAttr, stAoAttr;

        printf("------test 5--------\n");
        /* set the ai attr */
        stAiAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;
        stAiAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
        stAiAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
        stAiAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
        stAiAttr.u32EXFlag = 0;
        stAiAttr.u32FrmNum = 30;
        stAiAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
        stAiAttr.u32ChnCnt = 4;
        stAiAttr.u32ClkSel = 0;

        /* set the ao attr */
        stAoAttr = stAiAttr;
        stAoAttr.enWorkmode = AIO_MODE_I2S_MASTER;
报错LOG是:
------test 5--------
SAMPLE_COMM_AUDIO_StartAo: HI_MPI_AO_SetPubAttr(0) failed with 0xa0168003!
s32Ret=0xffffffff,fuc:SAMPLE_AUDIO_AiAo,line:579

2. 使用两组i2s是说soc上的不同i2s pin脚么?在3516a上看到可以用3组i2s_rx_tx。使用其中的2组,用一组的rx,另一组的tx?我个人感觉使用同一组的rx,tx分别做主从好像没问题的样子@.@

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 11:39:23
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40527&ptid=13186]zhuangweiye 发表于 2016-10-31 11:01[/url]
1. 其他都不改, 只改stAiAttr.u32ChnCnt = 2或4, 这样来匹配A/D过来的数据(这A/D估计是低端, i2s都是固 ...[/quote]

刚刚试了chn=2,可以作用,但是在bclk上的频率只有500KHz.
        printf("------test 7--------\n");
        /* set the ai attr */
        stAiAttr.enSamplerate = AUDIO_SAMPLE_RATE_16000;
        stAiAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
        stAiAttr.enWorkmode = AIO_MODE_I2S_SLAVE;
        stAiAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
        stAiAttr.u32EXFlag = 0;
        stAiAttr.u32FrmNum = 30;
        stAiAttr.u32PtNumPerFrm = SAMPLE_AUDIO_PTNUMPERFRM;
        stAiAttr.u32ChnCnt = 2;
        stAiAttr.u32ClkSel = 0;

        /* set the ao attr */
        stAoAttr = stAiAttr;
        stAoAttr.enWorkmode = AIO_MODE_I2S_MASTER;

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 11:53:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40530&ptid=13186]yangjking 发表于 2016-10-31 11:29[/url]
Hi
1. 设置Ai没有报错,在设置Ao的时候报错了。
代码是:
[/quote]

1. 海思的i2s输出最多只能有2个channel
    文档上这样说:

u32ChnCnt 支持的通道数目,实际可使能的最大通道数。
取值:1、2、4、8、16、20。(输入最多支持
AIO_MAX_CHN_NUM 个通道,输出最多支持2 个通道)

2. 3516A有3组i2s? 我的意思是如果AI/AO的主从模式不同就要用到6线模式

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 12:01:37
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40534&ptid=13186]zhuangweiye 发表于 2016-10-31 11:53[/url]
1. 海思的i2s输出最多只能有2个channel
    文档上这样说:

[/quote]

1. AoAi为2,还是500kHz.
2. 这个我是用的6线。
哎,蛋疼的参数

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 15:20:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40534&ptid=13186]zhuangweiye 发表于 2016-10-31 11:53[/url]
1. 海思的i2s输出最多只能有2个channel
    文档上这样说:

[/quote]

Hi
我现在想先录音Ai,但是看spec里面支持G711-8kHz,G726-8kHz,ADPCM-8kHz。
我现在的i2s rx为16kHz采样率的,那意思是不是不支持编码成adpcm了?

谢谢

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 15:52:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40546&ptid=13186]yangjking 发表于 2016-10-31 15:20[/url]
Hi
我现在想先录音Ai,但是看spec里面支持G711-8kHz,G726-8kHz,ADPCM-8kHz。
我现在的i2s rx为16kHz ...[/quote]

其实, audio编码和采样率没有必然的关系, 这里之所以这么说是指如果仔细看aenc的设置, 可以发现, aenc的attr中并没有采样率的设置, 只有帧长, 也就是说, 16Kz采样的数据也是可以送进编码器并得到数据的, 但是由于采样点加倍了,得到的码流基本上也是加倍的, 这样就不符合标准了, 也就是其他标准的解码器是解不出来的(解是解得出来,只是去播放会变调, 容易buffer溢出, 16KHz的数据当8KHz放)

如果是自己的编解码封闭系统是没有关系的,反正自己知道解码出来的格式, 但如果是开放系统, 那还是用8KHz采样,或者开启重采样比较好

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 16:03:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40546&ptid=13186]yangjking 发表于 2016-10-31 15:20[/url]
Hi
我现在想先录音Ai,但是看spec里面支持G711-8kHz,G726-8kHz,ADPCM-8kHz。
我现在的i2s rx为16kHz ...[/quote]

关于bclk的问题, 可能我上面的想法有问题

个人想法是否楼主可以把Ai/Ao都设成 slave, 这样一来海思这边就不用产生bclk了, 全部由A/D提供

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 17:07:17
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40551&ptid=13186]zhuangweiye 发表于 2016-10-31 16:03[/url]
关于bclk的问题, 可能我上面的想法有问题

个人想法是否楼主可以把Ai/Ao都设成 slave, 这样一来海思这 ...[/quote]

谢谢你的回复,我也觉得有可能在底层驱动关于bclk和fs的分频是有被限制,目前我打算让audio codec厂商改成hisi适用的i2s设置。
关于录音这块由于是新手,不是太懂,我再去看看其他参考资料,也试试,将其录下来看看。请问看其代码会生成snprintf(aszFileName, FILE_NAME_LEN, "audio_chn%d.%s", AeChn, SAMPLE_AUDIO_Pt2Str(enType));
audio_chn.pcm这样一个文件。
如果需要在PC上被工具播放的话,还得先调用函数对其去hisi报头,再加wav格式头?

谢谢

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-10-31 17:21:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40561&ptid=13186]yangjking 发表于 2016-10-31 17:07[/url]
谢谢你的回复,我也觉得有可能在底层驱动关于bclk和fs的分频是有被限制,目前我打算让audio codec厂商改 ...[/quote]


可以在 HI_MPI_AENC_GetStream()后面直接去掉海思音频头, 把码流写到文件里面

找找有没有可以直接播放pcm raw data的播放器

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-10-31 17:27:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40561&ptid=13186]yangjking 发表于 2016-10-31 17:07[/url]
谢谢你的回复,我也觉得有可能在底层驱动关于bclk和fs的分频是有被限制,目前我打算让audio codec厂商改 ...[/quote]

PC 上播放可以用audacity,或者cool edit pro,不需要加WAV头。
另外,Hisi语音帧头,只有过海思的语音编码器才会有,不过编码器就没有

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-10-31 18:15:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40565&ptid=13186]yang1372073 发表于 2016-10-31 17:27[/url]
PC 上播放可以用audacity,或者cool edit pro,不需要加WAV头。
另外,Hisi语音帧头,只有过海思的语音编 ...[/quote]

感谢两位的回复,哎,被这底层驱动也是整得累死。

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-01 10:46:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40565&ptid=13186]yang1372073 发表于 2016-10-31 17:27[/url]
PC 上播放可以用audacity,或者cool edit pro,不需要加WAV头。
另外,Hisi语音帧头,只有过海思的语音编 ...[/quote]

hi 两位,
今天我在Ai get frame后直接读取音频原始数据文件,代码如下。
            s32Ret = HI_MPI_AI_GetFrame(pstAiCtl->AiDev, pstAiCtl->AiChn, &stFrame, &stAecFrm, HI_FALSE);
            if (HI_SUCCESS != s32Ret )
            {
#if 0
                printf("%s: HI_MPI_AI_GetFrame(%d, %d), failed with %#x!\n", \
                       __FUNCTION__, pstAiCtl->AiDev, pstAiCtl->AiChn, s32Ret);
                pstAiCtl->bStart = HI_FALSE;
                return NULL;
#else
                continue;
#endif
            }
#if 1
            fwrite(stFrame.pVirAddr[0], 1, stFrame.u32Len, pfd);
#endif

然后用audacity播放后,这个感觉是2倍速播放的,我的i2s采样率是16kHz,两位有没有碰见过这个现象?不过从声轨上看,像是对的,没有噪音。

yang1372073

0个粉丝

19

问答

0

专栏

2

资料

yang1372073 2016-11-01 15:09:55
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40607&ptid=13186]yangjking 发表于 2016-11-1 10:46[/url]
hi 两位,
今天我在Ai get frame后直接读取音频原始数据文件,代码如下。
            s32Ret = HI_MPI ...[/quote]

代码看起来没什么问题
audacity播放的时候参数要选对(采样率,位宽什么的),看样子数据存储应该没问题的

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-02 16:38:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40629&ptid=13186]yang1372073 发表于 2016-11-1 15:09[/url]
代码看起来没什么问题
audacity播放的时候参数要选对(采样率,位宽什么的),看样子数据存储应该没问题 ...[/quote]

新开了一贴,将录音文件附上了。
播放的声音还是有问题,但是i2s rx出来的原始音频数据确实是好的。
所以应该还是i2s tx设置不对?
但是已经不知道该怎么玩了...

yangjking

0个粉丝

8

问答

0

专栏

2

资料

yangjking 2016-11-02 16:40:58
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=40629&ptid=13186]yang1372073 发表于 2016-11-1 15:09[/url]
代码看起来没什么问题
audacity播放的时候参数要选对(采样率,位宽什么的),看样子数据存储应该没问题 ...[/quote]

现在这版,我让audio codec厂将它们的i2s 参数设置成bclk 512Khz, fs 16kHz了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区