嵌入式开发者社区

标题: 数据一致性 [打印本页]

作者: ruddy    时间: 2018-6-13 23:42
标题: 数据一致性
工程师和各位发烧友大家好:我最近采购了创龙OMAPL138开发板用于音频信号处理,用了AIC3106+EDMA进行音频数据采集,然后处理(6748核心),在处理过程中碰到了一个问题,希望大家帮忙。问题如下:
" k' _7 i1 W- M1 Z& C/ T我修改SlaveLinein这个例程中,从三缓冲换成两缓冲,通过EDMA3把数据保存在两个地方  3 y1 l! `0 h: J# z) X  j
data[0][] 储存左声道数据data[1][]储存右声道数据, 然后data[0][]的数据复制到Mem_Copy_float(ConvIn+SYNCLEN-1,&data[0][0],2*BUFF_SZ);
5 d9 {3 ]! ?, m% V: N( |8 qConvin数组里面,然后做本地信号localSync做卷积DSPF_sp_convol(ConvIn, LocalSync, ConvOut, SYNCLEN, CONVOUTLEN);7 i( W: i& f: _' t1 y8 |  A

5 ^+ x0 K" s8 L4 a        CacheInv((unsigned int) (rxBuf0),sizeof(rxBuf0));
! o7 J0 A- z+ S  @        CacheInv((unsigned int) (rxBuf1),sizeof(rxBuf1));: s, F- W5 V& o% S0 j/ ~: E5 k
& c7 |! Z  a" w9 k2 D( T1 E
#if (CHNUM==2)
& n7 k3 J$ k7 Q% A7 \; l4 A( t7 M; R                {- [6 d5 c0 ~& G
                    temp=((rxBuf1[4*i+1]<<8)+(rxBuf1[4*i]<<0)-OFFSET);                   //左声道         把8bit变成16bit
& s, P3 r9 o1 m4 e                    data[0][i+BUFF_SZ]=1.0f*temp/32768.0f;                                         //转换成浮点$ R/ x6 O0 L" ^6 a
                    recdata_ch1[cnt]=1.0f*temp/32768.0f;                                             //保存数据不处理
$ [' [! @" [& s6 D8 o6 P                    temp=((rxBuf1[4*i+3]<<8)+(rxBuf1[4*i+2]<<0)-OFFSET);              //右声道3 p7 _  n; L% q' F2 g
                    data[1][i+BUFF_SZ]=1.0f*temp/32768.0f;1 \* z5 F; A9 h- A
                    recdata_ch2[cnt]=1.0f*temp/32768.0f;
; Q; ?- A5 }- \1 Y1 U                    cnt++;9 M# h+ C( X3 j, ]% ?
                }) n4 H: k* ~8 W3 N
* d4 b3 U* F) C! P7 ^
! T( n3 s7 s" t: m8 y# d
% p0 T( `5 h8 Y! E4 U
而recdata_ch1和recdata_ch2的数组很大,在48k采样率下可以保存25秒的数据,recdata_ch1和recdata_ch2不参与任何计算,只保存数据,用于观察数据是否正确。4 O; r- x1 ?4 Y: U
EDMA采样双缓冲模式,缓冲区长度160ms,每次缓冲满以后数据就复制到ConvIn,做一次卷积,做卷积的时间远远小于缓冲区的时间,这个保证数据不会丢失。
7 T% {5 L2 H2 R% z; z8 l; {出现的问题是,如下图所示,在信号空白信号中出现微小的噪声,而两个微小噪声的周期刚好就是一个buffer长度160ms
- g; U+ T% U* |& ~1 B9 a2 e; z& F5 K: N[attach]3223[/attach]
$ R( z% {3 t; X/ i/ T5 m
1 C+ J) X# _' q* _$ A- e2 E# q3 o: K1 |% {1 U: q
当我把卷积处理去掉的时候,信号是正确的,如下图所示/ \2 n1 H) T) s3 D2 S9 Q

8 n; }; G$ V  O- e1 H2 f/ v[attach]3224[/attach]
$ a$ {( h1 q# L5 A3 c) `7 |0 `7 T6 X; r+ E5 {$ ~  m' F1 y& r
上述所有数据放在DDR2中,在main一开始启用cache  
* q: w" \  C: t CacheEnableMAR((unsigned int)0xC0000000,(unsigned int)0x10000000);' }/ h" Z- x$ u, Z  F, ^
CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_256K);3 [! i8 `' c# Y6 g! p

6 [4 Z/ P* E7 x, X4 S8 d1 z7 s% ]: y5 s& S' m, a
我估计是数据一致性的问题,但是,不知道要修改哪里,怎么修改,麻烦大神给一些提示或者指导。感激不尽。
+ n2 A& K9 @: |9 e
作者: ruddy    时间: 2018-6-13 23:54
会不会是这样引起的,当DDR2的数据传输到缓存的时候,recdata_ch1的数据不会改变,经过DSPF_sp_convol()计算后,计算结果从缓存传回DDR2的时候,影响了recdata_ch1的数据?
作者: 广州创龙廖工    时间: 2018-6-19 15:34
您好,关于缓存一致性,建议您可以结合,我们提供的视频教程,进行深入学习4 x; H5 b+ D9 j7 g: u

- O- f- T. z# O+ f* i. ~9 f[attach]3235[/attach]




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4