|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 * _3 L2 U7 Z. R: L1 c% [
- f; P) K! d F( V6 V各位大神:
+ B0 h, @4 f# V, B+ T+ v: B 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
0 P% d/ ?/ a& [9 o. @8 { 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
8 B! p9 {& _ I- x2 P2 U7 V! T% a+ e/ o+ V# q2 |7 [
K% ~0 T2 o$ z这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
2 a: W! J$ }; X$ D
& S# n8 k; \; o2 I Q b9 V( f3 F并没有其他线程: v% `) h3 p. T/ w6 t
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。- {. ~5 ^ K1 x6 D9 z5 d% l S; J
也说不定是和堆栈有关系。。。。。。
& G# J8 j7 H. y' d6 m$ L- R请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....+ Z9 I; F( U4 h' Q1 r5 S8 W
. z6 n, G/ x2 N$ ] v
0 j1 @% ?% g. F9 {7 U+ o4 v; |( S y9 @+ r" ^8 G% @" Z
我也很绝望啊,希望大神能帮帮忙,感激不尽,!! C3 W( Y% H, D" b" g; ?. R2 O; k
2 y" `; D+ V8 \4 u5 t( |3 t' B* o# @4 |
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
& [, ~& f/ ^- U7 ~# g* P static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
5 [8 m! |) Q9 F& U! q
" V+ [& }9 B3 Rboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(/ c# ~4 B: l# V* z" b! L& G
const double data1000[1000]) {6 K- A7 ?& j4 w8 H. m0 S
1 k4 J" h [; A2 X5 x1 v int myfuck;* ^2 H1 _' _ }" T1 j; O! b2 Z
double yiDuanShuJu_mean;
3 S6 i0 u# S1 u! Q4 f double yiDuanShuJu_LowMean[1000];
0 s+ P* G& I( W int ixstart;
! q2 a+ K# N6 U) o. a a double dv0[1000];
X! w* y* u7 ]9 R) r: x: ` comm_AGC pAGC;4 c. `- k! D! w" V; V
comm_CarrierSynchronizer pFineFreqCompensator;
0 t& r5 O5 `) J; \/ Z dspcodegen_FIRDecimator pRxFilter;: S3 z% \9 ?7 D0 b+ o
comm_SymbolSynchronizer pTimingRec;
( m0 ~+ K! }. J( Q$ k comm_PreambleDetector pPrbDet;
/ `: k1 {# e% K* e2 p FrameSynchronizer pFrameSync;
Z. m: v4 b8 I/ | QPSKDataDecoder pDataDecod;! y! q8 C% v/ S; b) Y1 t/ G0 f1 V
static double usable_left_filtfilt[81000];
8 J" j" o& B/ D0 m- P static double youXiaoShuJu_QuZhiLiu[81000];+ h% ]7 I {+ }! r* D" S
double mtmp;; {5 W% K t3 r. N
int ix;
T) q$ {: Z; V" B1 T boolean_T exitg2;0 b9 b' d% l1 ^
boolean_T exitg1;8 E2 V7 W7 J1 X- p# x( m; }7 X
double YiZhenShuJu[800];
1 `% m/ z# j: C/ k5 n' X9 M double dv1[800];
1 F9 M. f/ b, Y' J ~1 s, \+ _# h/ l8 v8 b7 ^+ a% f- @/ o6 n2 I
6 G( [3 w$ J" a+ U* G6 w- U double b_YiZhenShuJu[800];6 m7 y& q! m( k1 c2 s
double I_filtfilt[800];" i3 X3 R: B: d; w2 L
double Q_filtfilt[800];
& c# c+ B a+ u( E" N creal_T b_I_filtfilt[800];4 ?- v( V& |/ B& C: j
creal_T b[800];- F# I& s/ u. N& | l& G1 X- n
creal_T RCRxSignal[50];
/ j) d4 v; ` f creal_T fineCompSignal[50];
7 ~# U/ ?- |' R5 q4 |' `$ L* K& @ double phError[50];
0 y2 y& ~* K E: ~ creal_T timingRecSignal_data[28];: [. H& H4 M- v1 v) i8 d9 ~
int timingRecSignal_size[1]; I3 t+ C% {7 E1 W: I1 S
double prbIdx_data[28];
f$ A: i* R+ w& \4 v# t9 V5 |& h( `4 v int prbIdx_size[1];: T/ }% Q- J7 v& f# H
double dtMt_data[28];: k( T& M$ U6 p g
int dtMt_size[1];
$ T2 p! G+ {( `' V r! s( L creal_T symFrame[25];$ P7 x* Q/ Z6 m! ~) m v# p1 v: w
boolean_T isFrameValid;
1 h- l/ R8 t- ^$ l# v7 ~$ F9 l double unusedU0[3];
& p8 |* F+ P3 o& v3 m' E* `# ]
6 ~$ E$ z, n8 Y1 e //调试过程中的变量' Z* H5 \9 Y) h! Z5 c% o
int enough_data;, g2 z! b* Y/ g+ t7 B
+ I, O* m# Y9 t& y( m6 Z int enoughDataFlag;) {7 q9 [# D0 d. E$ |6 u
int yiDuanShuJu_mean_int;
+ f; n! `; I8 u6 }- T1 @ int int_sum_dv0;# }; g) ]1 [" J
int oo;
4 B( h- u z# @+ T% N/ l int ii;( q& w8 H$ x/ H; r- Y
myfuck=10;2 X8 ~, @2 ~' c3 o
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
& E7 ?& T6 M4 g) d% {$ v' j /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */( v+ w' E$ a* Y* L
* |& W' \* N; c! w s8 b
yiDuanShuJu_mean = mean(data1000);5 w( k; t; [/ Q4 Y l% W( j% Q
1 S- }' b- ]7 A( ` yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
, h' ?4 }: a) o; ^ M) w UARTPutc('A');
# v8 |/ T7 Z8 y: g' C" h9 @" p UARTPutNum(yiDuanShuJu_mean_int);" R, ~' a$ I! A% E) O" g1 S0 ?
UARTPutc('\r');
; f* p8 F1 r0 a& A z UARTPutc('\n');
9 ~8 O r' M5 Z) `/ {! ?
+ {* |; x' q5 r" K for (ixstart = 0; ixstart < 1000; ixstart++) {
3 A* V6 s8 t. u: F) o yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
+ H6 o ~& Z% y6 b0 c4 s6 L }
* W! N3 A+ {4 C: A1 w, K
& t6 m( {- J& @: O$ k power(yiDuanShuJu_LowMean, dv0);" v" k7 @6 c3 Y j: }
. d/ K) E% d( U$ w1 ~; i$ q% F
int_sum_dv0 = (int) sum(dv0);' u' G7 {/ ^7 R0 A+ Z, n
2 x3 a0 n4 r) \6 L: V
UARTPutc('B');4 d" ]7 O" R& W7 b% T
UARTPutNum(int_sum_dv0);
! X' @. O: {8 z. A UARTPutc('\r');' g- Z2 W# Z# e# z' ?' k
UARTPutc('\n');5 f, O5 k% @" F: R$ ]9 ?
+ H- S; R+ J: c1 T( N
// int compareFlag = int_sum_dv0 > 1.0E+8;+ H4 v' ]- O! |7 ~2 J
3 ]- E8 L$ e0 \2 H4 h, A
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
$ b4 `3 j; M9 F' A UARTPutc('C');1 c Q8 j2 b+ k& p0 P
/* 比较信号能量 */
b! c1 H j' C /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */$ G0 I8 }) ?$ T) a
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
1 l9 A5 w) g" v2 w// for (ixstart = 0; ixstart < 1000; ixstart++) {. A. X h1 c2 X; Z! n6 k5 E6 c" i
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =7 _% k( k$ f7 v) p9 b+ ?6 q/ d% G
// yiDuanShuJu_LowMean[ixstart];
7 v1 k5 g" t3 j3 i// }
6 a" h- Y& m+ r' E( \//
7 ]% G6 c0 |6 h+ K' i// youxiao_k++;* u" B+ d Y9 K3 u
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
( t. n1 V2 J$ b4 L// /* 感觉要取21个数,即0-20, */
" D2 k$ i& u! X// enough_data = 10;//有效是10,无效是0
5 W2 z/ _- r, Z: ?8 G// }
5 s1 m& F9 U( V7 n' X7 U* V# F }4 M2 E. g) f/ Q
5 s: p' x5 y4 G. S$ X$ g
1 p2 K3 ^2 h8 S enoughDataFlag = 100;
& T4 T) J- a+ ]" C# Z ^4 i1 q4 M$ J; Y enoughDataFlag = 1000;
5 k! S* G: B2 R" [" ^; Q enoughDataFlag = 0x02;
' s7 m3 U! |3 n( d- j( z) r4 d enoughDataFlag = 200;
5 f- d1 q2 Y- C" K. p7 J Y1 ^2 E2 e q0 h; T6 p# f3 g
int myfuvk1;/ A) l0 f- H3 {/ S* N( P& X' ]! R' i9 V7 g
myfuvk1 =11;
3 o# W! V o" t8 y* k- u) q- o
( G2 ~- i/ O0 p5 U. L& N; b" @: M6 v$ N3 c1 b
enough_data = 0;
6 E+ C5 a. N8 m+ {7 U9 o1 Y) U) T" x: G' e
// if(enough_data>50){6 b# b W+ m7 y0 L# \3 B
// enoughDataFlag=0x01;
6 C( E V2 v) i8 U" H/ d# V// }else if(enough_data<50){6 Q$ L" ]. j! B& h, D, w0 S
// enoughDataFlag=0x00;//0x00还是不行. ]) z) I9 C# p5 {! R) @
// }
! k1 `: Y. y7 @ _
. X: B' Y J# @) w8 y; V9 r( r- n/ D' \7 t% r! z6 n U
oo=10;4 c0 L% B6 F# A
oo = oo < 5;0 G/ O! N _& V8 i. ^
if(oo){# U9 U% N/ c% P- ^
ii=0;
8 I& b' [6 I4 w* T8 ^ }: E- X* j# T2 P5 Y8 _, b
if(oo < 5){
4 C$ |! m3 `( a% @ @ ii=0;
: H; Y c! m6 s! N }
2 K6 T5 N! d4 s: n if(oo > 5){6 P4 o% j* u: [1 _. J" k5 I& W( ]+ b; ]
ii=0;. ]1 s, z2 Z; U' V/ T; h; G% q% P3 W1 w$ A
}
$ h/ s, {# a1 ~$ V4 t) M& R& [
: }6 v3 U2 k0 D! m /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */6 n5 W) u1 e; l0 f% f& {$ g( l4 l
/* 如果数据足够才执行主程序 */# j. G4 A7 _6 O
oo = oo < 5;! ?5 v: K0 V* \% m/ h# z, V
enoughDataFlag = enoughDataFlag < 5;
" F7 |+ b8 Z1 d- r+ F if (enoughDataFlag < 5) {
8 h: h4 a" s' w3 ?9 m' O// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0# k; k9 e+ O: d5 L. Z( `: t% G- U
AGC_AGC(&pAGC);
3 e4 W! A& n9 O0 f
$ d$ Q* f/ p7 t7 c8 D. d7 x c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
+ F7 Z& ?7 t, @; A9 P2 F& b FIRDecimator_FIRDecimator(&pRxFilter);
1 o8 }( @7 {+ x4 N- Z2 z. I1 ?& \' V2 t h# {9 w
/* Downsampling */
+ s. Q$ _4 f0 p c_SymbolSynchronizer_SymbolSync(&pTimingRec);
8 ~* n: L7 w+ Y0 {! ?2 }. |& v0 R ^% Z( t1 X4 }4 L# a
c_PreambleDetector_PreambleDete(&pPrbDet);
2 U$ H( J% U4 K+ p
+ q( \) x E( L& m /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
: N3 o9 E. Q- x- `- a /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
" u! h7 a0 j1 k) G! d /* %帧数量=100 */1 n) \. y# c$ R1 J1 }. M3 I3 Y
pFrameSync.isInitialized = 0;
0 @- I. a3 M B" e5 ^0 u3 R
: p2 Y, ?5 `5 j5 K( H) o /* [EOF] */" M6 M t$ K+ P6 {) L# l
/* 前导码长度是13 */9 L1 W# ]1 I' f$ `$ l
/* %qpsk */
9 P# d" y3 E" f6 P pDataDecod.isInitialized = 0;
! g/ r0 P" i; f( f, F% f2 C
6 W7 [& p5 v4 r7 e* _3 n3 u /* end */
+ _+ [& d, c* m9 f n+ Z; d% a( s5 e /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
, f. j _# ]( Y /* Convert 3-dB frequency */
; t1 n0 {; J! f/ s /* Convert 3-dB frequency */! e. @. J; ]) U/ F2 r3 q: W
filtfilt(save_buffer, usable_left_filtfilt);! d0 \& o3 a/ ?! T( i. C/ h/ K# j
for (ixstart = 0; ixstart < 81000; ixstart++) {1 S" ?7 h3 o! {$ w$ p
usable_left_filtfilt[ixstart] *= 2.0;
# w1 r. `. m$ d, u* P; g% E @ }
0 W0 J8 A5 I# L: L1 l8 g) D* C! H* f' F0 D a# h9 e7 L
/* 注意乘2,处理幅度 */" P4 o) Q2 t" U
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */% F5 T, v7 _9 l& A
/* %% 行列转换 */
2 O& b3 [, q l, c% e yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
: q& F& O: O2 m/ G# _ for (ixstart = 0; ixstart < 81000; ixstart++) {& N) k7 }. n2 ]. z
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
0 y. A3 K6 O( n. K& U# \ - yiDuanShuJu_mean;, G, I8 N7 l$ I S/ _# X) R* g1 x
}
1 d, \" Z3 i4 @1 E' n
4 E- P2 r& ?3 Z4 N/ z' } /* %% 应该对数据归一化,但是这一步放在哪比较好 */! D5 j4 G( R6 l! J$ G" Z' e
ixstart = 1;
# W; f3 l$ q' m. m mtmp = youXiaoShuJu_QuZhiLiu[0];& l& x; c$ R' g+ i
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {! ]3 q9 s# n8 d6 w$ ~: d
ix = 2;
# l( [# f8 J! Q# c exitg2 = false;0 c8 s9 K; j5 a8 A* P
while ((!exitg2) && (ix < 81001)) {
! F; e1 q6 A) ] ixstart = ix;
+ ^6 i# s5 [5 V1 O) k% q7 c2 { if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {7 [$ i# k6 p1 M( l& A! r
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];4 ]; B$ {( g' R( q
exitg2 = true;
+ H. l1 n# D T* a$ O7 I) @8 f } else {
2 _$ O) o% _+ ]6 r: n3 R ix++;/ z& M W9 P6 O
}( R- a7 ~* G2 w$ j s
}" o; q6 M- [; X2 ~" I
}$ L6 R% R) I# d$ c
0 D+ _8 n0 `) |5 Z& f- |
if (ixstart < 81000) {
9 F2 T8 ]3 y. b while (ixstart + 1 < 81001) {+ j. M& f/ ]3 S7 G# g
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
% v/ V( {3 s! N! ]0 f1 f; X mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
5 O7 o; O% J- d& E9 L2 n) T+ ~% d }
. ~* ]/ G" @+ u% _+ j" O
' R. x1 }2 a$ b, d9 _. ]0 _ ixstart++;
) R, I0 R6 _ c1 h, m8 `# o }
" K. q" I v9 o& ^ }$ i) r4 W; o6 X# r3 g
) Z" h8 @8 \$ n. O ixstart = 1;
) q$ V' Z: s5 {9 w( m yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];8 E& e- W" t3 @4 n+ x. c2 r6 u: R0 r
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) Y. M9 Y) e! ?6 } ix = 2;
: T/ k' G9 ?/ `! `+ L1 l- U exitg1 = false;) I+ g8 e, o! K
while ((!exitg1) && (ix < 81001)) {
/ Q5 _7 F, P: K" z( ~ ixstart = ix;
2 R: j9 a+ y! B- i) ~ if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
+ {: R6 M" P. ?# r+ V5 _# a yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
; t; k% K- n3 c) O$ d$ M exitg1 = true;
2 m: z) v% f/ {. A8 j E! t } else { t; {$ L5 u1 }3 k! p* d
ix++;
( i( G q8 y+ Y+ f' Z1 @ }! Z9 ?: ~. c% H. n" C
}
( H' D4 `$ @8 A; P6 l: i0 o }9 p1 C7 G9 h7 u$ z
' K9 u6 d' f( P$ r y if (ixstart < 81000) {3 H- M1 L/ W; m/ l6 O- Z& c
while (ixstart + 1 < 81001) {
( `4 k0 d: E7 p2 I! r8 s if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
2 u$ m4 P! M# R$ m. h; q yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];7 e- E! M0 y3 t- b3 ^
}- b' e" e6 u9 c
! O5 B* @# \" u; f* A
ixstart++;4 l/ ]2 r+ L) |3 \2 x' P. n
}) `7 K9 J0 K- N* a! l, ?. O
}
2 n, G% [2 E0 `# L, U7 R e
) X5 n* C" w: m$ ^. j% K yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);! i" S7 |: p! s9 [1 u* J5 L5 g
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
. e$ v/ l3 v( J! F5 _ yiDuanShuJu_mean = mtmp;
' q" r5 B" D& R: k! @0 N }0 X& v0 q9 i' `, U/ A" ]2 S, M$ O
2 G7 E4 k4 w% Z% d, V# i
/* 找出极值 */
- U) v6 R) f( L' A1 F9 M for (ixstart = 0; ixstart < 81000; ixstart++) {
1 \: L- Z0 s$ P# j8 T% h% ~5 B% |2 q. i youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
9 d5 |. A9 S) e4 i }
1 P1 Y# k5 D! ]- ]+ @" N! i- y3 R1 f7 |8 R& J( f
--------------帖子字数限制------------------; I7 g% R! i0 ? D3 v( F k0 B
}9 |( O2 B8 H7 R- Y! r; m. L
* a/ z& V7 \/ q! y1 N8 o0 M d: T7 r" G. K, A5 k
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|