嵌入式开发者社区
标题:
数据一致性
[打印本页]
作者:
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 q
Convin数组里面,然后做本地信号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- e
2 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 z
7 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