嵌入式开发者社区

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

作者: ruddy    时间: 2018-6-13 23:42
标题: 数据一致性
工程师和各位发烧友大家好:我最近采购了创龙OMAPL138开发板用于音频信号处理,用了AIC3106+EDMA进行音频数据采集,然后处理(6748核心),在处理过程中碰到了一个问题,希望大家帮忙。问题如下:6 x7 x) s5 f+ z  \+ q3 B
我修改SlaveLinein这个例程中,从三缓冲换成两缓冲,通过EDMA3把数据保存在两个地方  ) Z& ?( X0 N- [, R" G
data[0][] 储存左声道数据data[1][]储存右声道数据, 然后data[0][]的数据复制到Mem_Copy_float(ConvIn+SYNCLEN-1,&data[0][0],2*BUFF_SZ);
, D# l3 V# G8 E: V) MConvin数组里面,然后做本地信号localSync做卷积DSPF_sp_convol(ConvIn, LocalSync, ConvOut, SYNCLEN, CONVOUTLEN);7 X5 |: O( r8 h0 K; m3 L5 K9 m  j
; z* k1 u1 s' b7 y' J$ y5 d
        CacheInv((unsigned int) (rxBuf0),sizeof(rxBuf0));
: d/ @# I! W: R9 H# S        CacheInv((unsigned int) (rxBuf1),sizeof(rxBuf1));( X, K4 v, M" V4 D+ S6 A2 }
% _' r- s6 f8 P( z# \9 e# ~
#if (CHNUM==2)4 ~  q# m! M/ P, e. \/ Z
                {6 u! S# B" Z$ a2 t4 D
                    temp=((rxBuf1[4*i+1]<<8)+(rxBuf1[4*i]<<0)-OFFSET);                   //左声道         把8bit变成16bit) k) \! h5 A% Q  I
                    data[0][i+BUFF_SZ]=1.0f*temp/32768.0f;                                         //转换成浮点
: Z9 E  F6 P6 b2 j3 y                    recdata_ch1[cnt]=1.0f*temp/32768.0f;                                             //保存数据不处理
5 J# K6 s: y2 @7 @8 F                    temp=((rxBuf1[4*i+3]<<8)+(rxBuf1[4*i+2]<<0)-OFFSET);              //右声道9 V7 Y- t7 h% D% D5 y
                    data[1][i+BUFF_SZ]=1.0f*temp/32768.0f;6 n3 t7 n7 ?, }% C5 B. H( C
                    recdata_ch2[cnt]=1.0f*temp/32768.0f;
4 ]9 c2 X9 i9 P1 @4 E: |: a4 [- ?                    cnt++;
- ?- i# _( S- M5 N  a: n0 ?                }2 o7 U4 X# W4 W4 S2 N7 u
* l+ b3 \/ j( p3 b/ k% |& P/ |

: V/ y) ]5 C) z$ [4 f7 p. r) C0 N! v- w$ {8 I! J) U# {% A' R
而recdata_ch1和recdata_ch2的数组很大,在48k采样率下可以保存25秒的数据,recdata_ch1和recdata_ch2不参与任何计算,只保存数据,用于观察数据是否正确。
% z4 h/ A3 g3 l8 \2 zEDMA采样双缓冲模式,缓冲区长度160ms,每次缓冲满以后数据就复制到ConvIn,做一次卷积,做卷积的时间远远小于缓冲区的时间,这个保证数据不会丢失。
1 F4 o+ i- N3 q3 g3 H出现的问题是,如下图所示,在信号空白信号中出现微小的噪声,而两个微小噪声的周期刚好就是一个buffer长度160ms
' s* b' }- ~" L. v1 Q* h) |" p[attach]3223[/attach]% m( s- u& c$ |
% G! d. T: p+ I
4 h$ Q9 ]9 {* \
当我把卷积处理去掉的时候,信号是正确的,如下图所示
9 A; U$ m( n+ C- w' I5 [/ l' e( k7 w) k  q4 e
[attach]3224[/attach]" ~5 r! e5 f% ?  X0 Y: F- w

" m5 W! W( \. b; T" X上述所有数据放在DDR2中,在main一开始启用cache  
! A0 O# J2 Z* `* e$ Q4 s# l CacheEnableMAR((unsigned int)0xC0000000,(unsigned int)0x10000000);* U% @1 F, I6 t; Z3 A
CacheEnable(L1PCFG_L1PMODE_32K | L1DCFG_L1DMODE_32K | L2CFG_L2MODE_256K);
. i' ?! ^* A/ c& K0 k3 r5 Y* @& u6 n! j
# B0 t3 }8 @. `' g9 T  k( q
我估计是数据一致性的问题,但是,不知道要修改哪里,怎么修改,麻烦大神给一些提示或者指导。感激不尽。, \3 u+ ~& x1 Z4 Y

作者: ruddy    时间: 2018-6-13 23:54
会不会是这样引起的,当DDR2的数据传输到缓存的时候,recdata_ch1的数据不会改变,经过DSPF_sp_convol()计算后,计算结果从缓存传回DDR2的时候,影响了recdata_ch1的数据?
作者: 广州创龙廖工    时间: 2018-6-19 15:34
您好,关于缓存一致性,建议您可以结合,我们提供的视频教程,进行深入学习
0 \$ V! U: C$ c' L" n" x
0 r2 u5 F3 `, O$ N2 I. `[attach]3235[/attach]




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