|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 " P5 e' B6 F6 }% F. }# q+ s- c+ U
3 }+ z+ V9 G- z7 T0 M
各位大神:2 U, N/ j1 W+ n3 G/ K% F# P2 l" t7 B- N
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
* f) N# G* y: R0 F 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
- ]/ y4 W* j, O! a/ u5 |, g& M; Q% o' H" ~0 ]" X
# n- e* u: g! T v/ J/ T这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。+ z) Y2 L, ~' o8 a0 P
! U. R0 F! {, y* x! `' C( M+ }0 |# k并没有其他线程
- b4 \4 L0 w# l反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
3 N( z' N; Z9 u6 A! b) L; R也说不定是和堆栈有关系。。。。。。- J* t; v' g- T7 d% P
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....- G- j! G# V( G/ T; J- u9 D
! n' x6 _& v0 F# _. I- T
8 D7 s- k9 O p8 G# Q) w6 U1 M+ A+ x. f& G O6 c
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
6 k' ~/ x, F" \; Y4 O" q# J9 h1 M) ]# H( }
/ S1 K( b5 z9 L" D$ ~; P附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000]; H6 d0 ^' w8 J+ _* O+ w r
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
6 ?5 ?$ X& ?' ^+ N, Q% E) _, |, n1 E- e
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
* t" r, A, M f8 o const double data1000[1000]) {3 @8 E# y, I4 H& U
( C3 s" ~9 T: ` W" G w+ n int myfuck;
/ p; h( d; P3 O8 {; [% ]( `# i( y double yiDuanShuJu_mean;* R& A% e# R/ P" i% Z$ g5 h
double yiDuanShuJu_LowMean[1000];0 [" ^6 n9 J2 F' u
int ixstart;! E/ D) v i& m% b7 f0 j. `8 g
double dv0[1000];, p9 Z# b) v: w# I
comm_AGC pAGC;
# V$ X- i) Z# Y comm_CarrierSynchronizer pFineFreqCompensator;% Q- T# x! g2 R+ }% f
dspcodegen_FIRDecimator pRxFilter;! N5 w9 _- T/ r
comm_SymbolSynchronizer pTimingRec;
4 }0 l7 E. S0 ^ o u comm_PreambleDetector pPrbDet;
" ~4 [% }! b" S FrameSynchronizer pFrameSync;& z4 g o7 J; _3 F9 f
QPSKDataDecoder pDataDecod;- s0 u) N' \4 P7 e! a
static double usable_left_filtfilt[81000];/ D! n& z/ ~ P( }3 n
static double youXiaoShuJu_QuZhiLiu[81000];6 q8 T% s( z' G% v2 J! A+ }
double mtmp;2 g5 I' M# H5 V+ d9 H: b
int ix;
% P5 W0 R2 k9 k4 t boolean_T exitg2;
a+ X/ D, c) \) ~& u' D; [0 a# f boolean_T exitg1;- \; ]6 {! |6 t' m3 I
double YiZhenShuJu[800];
. n- @" r; {2 q# W double dv1[800];
z% d- e4 H3 P, {+ j0 n
7 i) G, t9 U4 ~. F. z
& j; S& K$ q& D. K; L& o3 G! `# ^ double b_YiZhenShuJu[800];
- G4 E/ e: i1 K/ { double I_filtfilt[800];
$ H" E: p9 z+ k double Q_filtfilt[800];
0 X; U# ?5 p( k. d0 m creal_T b_I_filtfilt[800];: _) S, Q4 K- p+ P! K
creal_T b[800];
) R+ h5 U) a+ O$ x creal_T RCRxSignal[50];
4 _5 d2 o6 Q4 o. \ creal_T fineCompSignal[50];
$ W2 [% j' E( m double phError[50];8 C- l; x" z8 M# r. H
creal_T timingRecSignal_data[28];
! k0 `6 J4 c' E+ H- o1 t$ D e int timingRecSignal_size[1];* \; G1 E3 e0 M5 Z; ^
double prbIdx_data[28];
- X/ s& M$ x) J4 F" s int prbIdx_size[1];
6 s$ U- }) o6 K9 }9 W double dtMt_data[28];
/ p% I0 g% v6 W; M$ m int dtMt_size[1];
$ e+ z1 Q& c! J2 P6 [6 Z creal_T symFrame[25];
0 c+ B) b @4 d8 w0 t3 J boolean_T isFrameValid;7 D/ I8 k( r' {
double unusedU0[3];+ l' q" W4 S. ]& A6 d2 W$ x
( w; j. ~, y5 V( I+ H+ _9 Z$ O
//调试过程中的变量
; |0 x* j) p, ~1 @ int enough_data;
7 \$ ~% g4 h) G/ |; ^) ?
- g0 g; X1 Y5 f- Z9 W int enoughDataFlag;
: o: J9 H* X$ J" W: X* P9 Q" K int yiDuanShuJu_mean_int;
9 f7 x+ p p* Q1 I5 ^% q int int_sum_dv0;
: L0 i+ m. n% a, i) v int oo;
5 R# ^! w( z E- `& |2 r int ii;
c/ |# {9 C u, X( g myfuck=10;0 q# z/ E6 ]# c6 H
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
y; e$ \) T" I* e: E0 d /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */+ o. j* b6 V6 s9 r
) M% C0 B8 n y) c' y& K* S yiDuanShuJu_mean = mean(data1000);9 K2 M- V. F! P8 {/ X; O" Y
: N: v3 L% t, t, [' `$ ?7 |
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
; x% k# e7 w7 O: n UARTPutc('A');7 R0 p; R" q% Q, \0 ]+ I
UARTPutNum(yiDuanShuJu_mean_int);
. P& N+ {8 `5 P) l UARTPutc('\r');9 M3 V- Y1 X5 [" x; W X
UARTPutc('\n');
8 Q9 ^0 U, ^3 n& Z# j$ e; @ [3 ^" ^3 k2 `
for (ixstart = 0; ixstart < 1000; ixstart++) {
' K' q. \- @$ {/ U. @' j yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
' R$ E: S6 a1 Y- [/ T }
& Y n1 f) v! ^2 D! q) t
) n: u6 C0 N Q6 _3 @ power(yiDuanShuJu_LowMean, dv0);
6 V' V0 {7 n I/ i1 Z$ y; X: J3 G3 _3 e, U* y
int_sum_dv0 = (int) sum(dv0);
: `( f. A: F3 g2 M, }5 F3 N
; v3 G5 n+ x8 Q& T( Z( [ UARTPutc('B');
D: ^6 j! k1 c, X1 @( }$ I UARTPutNum(int_sum_dv0);8 n' ^# E0 R* u1 p' r
UARTPutc('\r');
( S% J' U8 A9 j$ Y UARTPutc('\n');
3 f8 Y+ p" s1 p
/ l' x- N- h+ \/ b9 A. r! h) Y// int compareFlag = int_sum_dv0 > 1.0E+8;/ Q4 F6 I7 C* @/ \/ \
6 u0 E1 O1 ~+ m" F6 v7 k' y5 A
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
/ v/ V/ t' M) o0 P$ H7 x UARTPutc('C');8 l) d1 l; T. r" Y
/* 比较信号能量 */
4 P# v$ R+ p' E' i* t /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 *// L; k& l+ S/ @+ o s
// yiDuanShuJu_mean = 1000.0 * youxiao_k;: S% ]; ~" q2 l: Q
// for (ixstart = 0; ixstart < 1000; ixstart++) {( K' Q5 W3 }: [4 T! c2 D8 Z2 e
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
; s8 z# A7 _0 [9 M7 p( ?7 r0 }// yiDuanShuJu_LowMean[ixstart];9 N) \. \2 C; C+ D) [$ A/ \
// }
r2 q, U# z8 B( G6 N# v//+ J. V! s" q# b. x( g% ^
// youxiao_k++;
3 K$ a. A, m3 J" g# |0 y// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 G- d4 @ w" h0 a `7 e1 n
// /* 感觉要取21个数,即0-20, */
5 b* z1 b2 e. ?( Q$ `// enough_data = 10;//有效是10,无效是03 S/ Z' o. f7 b% V# M8 B7 q
// }
% w2 f& V3 S+ b } z9 P+ o9 Q* x2 u
: v$ [# H; w, g5 M) c8 Q! { Q
. G: \8 E7 x6 N- x* D, \7 l' { enoughDataFlag = 100;
3 o9 r: J/ l6 y enoughDataFlag = 1000;
7 {) T5 q( D4 x, U enoughDataFlag = 0x02;
2 [9 k1 n7 J- r* @( n" O0 W( h enoughDataFlag = 200;
$ M! ]% j* o* \( I0 t6 J. F" w" I- u5 A/ x) B( P2 g
int myfuvk1;
' k% T$ T: `1 q# {0 {: ~! L0 b1 A myfuvk1 =11;5 R& ~- R- m3 b; @4 [3 c3 W G
( M+ W. Z6 d/ A i
^( t: v( I5 P+ J8 y1 Y enough_data = 0;/ ~) H* z2 X- i2 p; P* p! M1 _
! @% U) [0 v3 O- [* \+ Q// if(enough_data>50){- P5 c9 J6 u' b: M1 g
// enoughDataFlag=0x01;% Y$ n* G5 C* _* m# F5 P, U: a% _
// }else if(enough_data<50){
% ~) n. i8 ~$ N% l/ T& m0 O4 D$ g& C' r// enoughDataFlag=0x00;//0x00还是不行1 w' _* ^2 [6 o
// }
l. |0 o; h) [: e4 h
( x, ]& |5 q9 k+ W- u; f, L% e8 G5 a. V* S* G
oo=10;
) M4 n( H0 |' W1 D2 R. e# y oo = oo < 5; ~9 X8 u; x) c2 ?
if(oo){
2 a' s5 e; h% a9 \ ii=0;+ g# \' V8 A% y/ w: E& e) {
}
8 V3 v$ e* _: M {) w if(oo < 5){
) ]% X% k1 U4 ~' a7 T; [ K ii=0;/ N; X6 C2 G u l
}
4 _! P" i: @6 O' X if(oo > 5){
) x0 B% @ l7 I# F$ w$ o* q7 o) i ii=0;& |" M) }- v6 h8 j! S7 {. a
}
w4 K# T" O$ X5 I5 p
0 |& z& B4 f6 C4 C/ j( ? /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */2 f& G2 _" ]& L( ]) B; c+ N
/* 如果数据足够才执行主程序 */, p1 h6 x5 @1 }4 t& h7 `2 r
oo = oo < 5;
6 M% j+ S2 ?( w3 s" C( @* [ enoughDataFlag = enoughDataFlag < 5;6 T% f N( N' P2 \& C" Z
if (enoughDataFlag < 5) {
, u2 U$ V. o8 \/ Y- Y// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0+ Q5 |6 L: }' H( w4 V- R
AGC_AGC(&pAGC);
& S- q# H g$ C" f. c4 G! |( i3 K, p3 O
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);; a' ?# T7 t8 U: Q. O: z: u% z6 ~
FIRDecimator_FIRDecimator(&pRxFilter);; P* D. w% k1 z% l5 H3 p
9 g, L; i% F: C$ @7 L
/* Downsampling */
4 [( j1 [+ I- m: X) x" _" J" V c_SymbolSynchronizer_SymbolSync(&pTimingRec);
- ?4 l' i# `0 K9 n0 s" H4 M
3 I% }: J. C3 I c_PreambleDetector_PreambleDete(&pPrbDet);
( o/ {3 D: v# J8 b4 p% ^, r7 {$ m9 j4 n" w
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */6 z+ B4 F7 l% j) s7 L3 H
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */3 S: w4 M& g! x1 O+ B) H+ a
/* %帧数量=100 */
0 }1 H/ M8 j9 Y2 E8 F pFrameSync.isInitialized = 0;) \! z# {9 N- Y5 V
. b! M8 }$ U* \* m- l- H |1 d /* [EOF] */
7 h! |- @1 C- I /* 前导码长度是13 */; J, v, [- V1 X$ O% ~! m
/* %qpsk */3 F* I/ i- ~2 B4 j
pDataDecod.isInitialized = 0;4 ?: M3 w$ k% W F
+ x/ R3 R! \) f) z9 `$ r3 n' W /* end */
& S# s# m- H j" S4 J: Q3 `3 J: q1 X /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
) b9 ^) O: S/ H& b9 _2 t /* Convert 3-dB frequency */
/ G3 G- t* `+ @4 L4 x2 s' D /* Convert 3-dB frequency *// b4 x0 W0 T d7 A# W1 F
filtfilt(save_buffer, usable_left_filtfilt);
) U" [' d9 C( @* O$ {, f& {8 T for (ixstart = 0; ixstart < 81000; ixstart++) {
& a- {) {8 `4 h/ u usable_left_filtfilt[ixstart] *= 2.0;
9 O) P; ?- L2 |3 r4 a& u3 a1 j }3 G! U$ l- e7 n3 k5 ]- \
1 C# N, l C" N8 B5 c
/* 注意乘2,处理幅度 */1 `3 _; n5 J7 G( n! K7 j- L
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
1 A1 t; R( z# T8 c) d( m! Q/ ? /* %% 行列转换 */
1 l( U( k. a! C* ?: y3 x- a yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
+ ?, X* }4 `; Y) ~7 \ for (ixstart = 0; ixstart < 81000; ixstart++) {
+ [$ D) h3 S& K; u+ d: E5 A youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
- V( X+ ?1 `9 A( M% D& s - yiDuanShuJu_mean;3 _; U: e5 L/ N$ J0 |; q4 @+ @
}
, W) @! `9 j8 d: M5 g8 @8 T& K) D! H
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
% X- W6 j+ c: L& s ixstart = 1;
( M! R2 E1 _2 C& s; C2 @ mtmp = youXiaoShuJu_QuZhiLiu[0];' J( r! D) x$ G
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
: q- x9 ~& C5 m% ]. H/ x ix = 2;
! @4 G" N2 G7 L! a. F! ^ exitg2 = false;. _) X2 O& g9 g- o
while ((!exitg2) && (ix < 81001)) {
5 A$ I$ W6 H8 ]9 j0 X ixstart = ix;" S1 v6 j& D7 w: a( N* `6 e0 Z/ j
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
6 m) j3 o( I0 k. W mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];( J# e5 t+ D3 s
exitg2 = true;
+ n; Q3 }5 |6 ? } else {$ J6 b& t& B7 F9 `" [2 M
ix++;/ C9 S2 N2 Y9 M! ]+ O
}6 y8 m: P/ u9 a, q1 b
}' K0 R: P9 G+ k: h
}
% o( o& i6 D8 Y: D) e$ X6 ]1 g- g- }
% F; B3 l/ E5 \* |6 e if (ixstart < 81000) {7 l8 C: g0 n3 v5 ^! b4 D, x! U
while (ixstart + 1 < 81001) {
6 r. J8 D' x9 ]# x5 j- n if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
* ]) q h* L. J mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
9 G7 ^+ ?7 s& n1 W4 } }5 D! r& E- R' h( c
& F9 ?2 m4 L4 \# d
ixstart++;& |$ k( ~% r. e9 Q9 e
}0 v8 z, V. o& d
}
! U9 ]! N ?4 z9 t2 Q
8 N: B8 |' Q, c* w ixstart = 1;
8 K3 o+ E1 K% b, ?0 `' J yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
' I" I8 d' J/ i. |% u, Y- a if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
( ]1 h: M: B: \& ^1 t/ h& h ix = 2;
5 k/ u0 u/ e) F+ N exitg1 = false;
G* V8 w0 C; Q while ((!exitg1) && (ix < 81001)) {# \1 |0 x& g* ^% Y. R- l
ixstart = ix;4 L* P' g0 g/ k" w9 B; z
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, _0 F' W1 ], g5 q1 L8 i8 \/ K/ t( A
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];$ J4 V/ j0 ^3 [1 F8 k4 W8 I" w
exitg1 = true;
, I/ e5 J; |8 M7 }$ m } else {
+ @! w. B0 j( L5 k0 p. ?$ f- u. W ix++;9 Z6 J0 K" B2 n5 }
}' a2 t8 ^1 b( c) c4 P
}& X' k2 p! H& o: X8 q" q# a
}+ E6 _0 c5 w) h/ K/ d7 w
* @. |: i! S, c
if (ixstart < 81000) {
' f2 X9 v0 a+ ?. \8 ^' W while (ixstart + 1 < 81001) {
# C( \( d! v0 ~1 J+ h$ J. m if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) { R* `: {# b3 F; m
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];4 X# a6 Y& z+ K9 ~
}
5 z& o# G" O/ _" p2 x
; S7 y0 n* a' Q/ x ixstart++;& B7 I, P1 Q: k) N) m+ z
}
: p9 d( ~& o: J9 D2 N }
* j8 p4 I E) M [
# x& \- d' h; Y, R2 Z yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
7 ]+ E- i! n+ G; S" {4 c if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {5 r) c3 n" L2 B6 W
yiDuanShuJu_mean = mtmp;/ d- R$ d& s3 c2 s* P, f( [% p
}
; O8 {, _1 I; I9 H3 i5 s0 q3 ?( B
/* 找出极值 */
w( o5 l1 {! A& ] o: X: B3 |0 L for (ixstart = 0; ixstart < 81000; ixstart++) {# h3 j( N+ z/ s: R
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;! d. Y) U; W, D. M4 J: |
}
4 r! z" c* U* k& Y2 x& n" T+ ~/ r/ C9 S* A
--------------帖子字数限制------------------( b& Y, _0 O x. V7 A1 h
}
: W3 z/ @+ M- y$ V8 O, ]1 M7 s
$ p, x+ G1 v2 C( `
: ^$ _8 a! s, q9 B" k) q8 d |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|