|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
6 |: [8 x+ z$ X# o
. d( P9 k) _4 |' K8 n) B8 q各位大神:% ^. \; E) w/ R3 K9 A4 @
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~): B) G3 H. X# i4 I2 E! ]7 L* y6 h! J4 O
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:8 l3 k0 L: P- f/ u8 r8 E
0 _8 i- j5 u5 F4 w 6 J! O* R7 _' k9 l# j; Y/ p
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
. d6 O$ e6 L8 y8 o& x+ ?
9 f$ G$ ?) r' [( B* r( R2 X7 B并没有其他线程* b; F3 ^0 N9 b* F
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
i. [6 Z2 ^ H( o! } |也说不定是和堆栈有关系。。。。。。
3 x0 G1 k1 }( P4 A/ _请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
. b' L& Y/ H" K3 J) a8 y1 g
* a, Y# L$ ?& i* b3 e1 `
1 [& \, R1 M& D' @. F, z
; |2 }7 a* O# P- E我也很绝望啊,希望大神能帮帮忙,感激不尽,!
2 V9 Y @" e3 d% ` J$ j/ P' N; T# Q1 n
" b" C5 P5 h$ f, s2 |: r7 C) r! P- O0 D% _: I$ }8 @
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];/ b' ?; c _# L; b
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
( k5 y" B- N; l
- Z/ e! _) `9 A; k5 B! \0 }/ r; ~& lboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
' x1 ^, ?' T, I& w5 g const double data1000[1000]) {
9 h$ X: l7 d$ R
2 k: A* N8 V4 x0 ~3 v3 B2 Z; { int myfuck;9 K, v* }5 a" t0 H1 q5 Y4 V) b+ f
double yiDuanShuJu_mean;
9 c) N- o+ o5 J4 F4 A, L/ P double yiDuanShuJu_LowMean[1000];
) }$ v7 G0 y& ^9 _ int ixstart;
7 G" w, ^% o* U% {9 p double dv0[1000];+ Q- t* H: n& ~
comm_AGC pAGC;
8 x/ s0 a# z$ J8 h2 l$ D comm_CarrierSynchronizer pFineFreqCompensator;) V1 k/ A- P( @: W1 |( e2 O
dspcodegen_FIRDecimator pRxFilter;
7 e" q' u @& j( o comm_SymbolSynchronizer pTimingRec;
: ~" r; t) R& i, [8 q comm_PreambleDetector pPrbDet;
R% b; F% v5 @3 m FrameSynchronizer pFrameSync;9 m7 O) N$ B. q, C
QPSKDataDecoder pDataDecod;
2 p" z" C2 t: }" I5 V, E0 D static double usable_left_filtfilt[81000];0 i4 H7 K; d3 P) Q2 d
static double youXiaoShuJu_QuZhiLiu[81000];
2 A: L; F2 }' |" n0 A' h; w+ u double mtmp;
" m9 c9 ^' F" @+ D int ix;- ^ g) h s, S1 e! s7 j7 S4 g
boolean_T exitg2;6 Z2 e/ e; d; ]6 L" |: v! z
boolean_T exitg1;
% t7 m, L ^# t, Q double YiZhenShuJu[800];) o. L! A# C6 I; o/ T; F6 D1 i
double dv1[800];: j m1 g3 P. V% v. [
5 q, t$ F6 c: C, h3 w
2 ]+ b& U. P8 U
double b_YiZhenShuJu[800];
# W j5 A; q: h* {! l9 M5 @ double I_filtfilt[800];
! g- O2 F" G- ~ double Q_filtfilt[800];; t. j+ m( H: j2 l% d* H6 r
creal_T b_I_filtfilt[800];
6 r6 ^5 E* w' C creal_T b[800];" {( O2 |$ b% x" f
creal_T RCRxSignal[50];; @. ^8 U+ n0 i; N
creal_T fineCompSignal[50];; y- {$ b* g+ r+ x1 r: G" ~% R
double phError[50];
) Z& R: [) K! ~( }. f' y; A creal_T timingRecSignal_data[28];
3 Y- O5 G1 S$ i2 Y6 s6 c; L4 W4 c int timingRecSignal_size[1];
# C$ D/ [, N) P A$ T# I9 P' k' W double prbIdx_data[28];0 P+ J" ?8 H( X3 Q1 y# A9 K
int prbIdx_size[1];
- C2 ^' o- t% n Q0 H7 S$ N( J+ g double dtMt_data[28];# o; Q* D! p" ~3 p8 b
int dtMt_size[1];
/ h' C c% n- X creal_T symFrame[25];
7 B4 _8 O. ]' @1 W% T boolean_T isFrameValid;
2 \4 u% Q/ j$ x4 A) m* N# L double unusedU0[3];
4 E2 j' q" k9 j+ g0 Z/ Q5 O
# i8 {$ q. I6 ^4 {" }( N //调试过程中的变量) u" I- O* O+ ]5 n
int enough_data;
" k, m7 g6 k0 Y9 V" i! X% y% i( P# r0 V( n O8 a1 U
int enoughDataFlag;
" A7 a: U) Z- n& d+ m- w int yiDuanShuJu_mean_int;
& Q! B3 Y( H/ a# b8 r2 g$ h# H% l int int_sum_dv0;
# b- n# t3 s( d7 m/ z int oo;
7 [% w! b0 {8 u6 X int ii;
* z& `: G/ x e! R4 T x myfuck=10;
; F& N7 D, ]7 P; ^ /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
3 Y7 Y' r. C9 ]: D/ @4 C" z /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
* N! F& @5 F G. g0 O& P: l9 n1 R. u3 q$ J O. n2 h5 V
yiDuanShuJu_mean = mean(data1000);
, i, J2 K9 D* i) q S! s! b9 F( S
. B) c% i2 \6 Q5 v" M3 _7 T$ d6 x! q yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
7 t7 S9 h) Y" e$ a8 V: E& [ UARTPutc('A');) e/ c- v5 k" ^. s
UARTPutNum(yiDuanShuJu_mean_int);
* X" _, D/ K! p! b6 n) M7 \4 R UARTPutc('\r');
$ I7 G/ D5 l' }* S' H UARTPutc('\n');
4 g2 p& Z# G* f; y* l! N6 \
5 w9 }) R. O2 V7 @4 P for (ixstart = 0; ixstart < 1000; ixstart++) {
7 y$ H8 s8 ~% V0 g yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;3 |# s- m ^4 v0 ?3 N/ `1 ^
}
0 P) T" w1 E3 H" [! |5 f; t4 \( z! X& c/ h4 j4 y3 G! P4 y. j9 v( F
power(yiDuanShuJu_LowMean, dv0);7 }3 d9 q' N- P
4 L0 f. c: X3 w
int_sum_dv0 = (int) sum(dv0);
& m$ Z3 x) E/ E3 Z( o
% |* L& W$ Q3 K UARTPutc('B');4 w& M# X* c5 t* U8 `
UARTPutNum(int_sum_dv0);' J7 n1 G. l' [. Y- T) D: L
UARTPutc('\r');0 x, n. C9 N* S
UARTPutc('\n');3 B8 U/ V1 T, k# D; G
! _4 k" ~, B1 J' c6 {$ D' I// int compareFlag = int_sum_dv0 > 1.0E+8;
* P& D o( p Z* u& t7 G( v) Q! V6 l: I: j
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?9 A) D) N# D# L6 E1 P4 F9 x
UARTPutc('C');4 u, i0 d. [! O& o/ j
/* 比较信号能量 */4 Y9 C& @4 z0 L2 x1 ~
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */) Y4 {+ v. i: W8 l& |1 ^
// yiDuanShuJu_mean = 1000.0 * youxiao_k;; P' [ F5 b3 E
// for (ixstart = 0; ixstart < 1000; ixstart++) {
; A. i7 t: k- n9 ?- H$ [// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =9 y( s) K& l$ z6 ^+ r
// yiDuanShuJu_LowMean[ixstart];- G5 I4 z r8 I* Q/ o9 `
// }2 V% N: ~! s8 P8 C0 F$ d
//6 D& r# ^4 G1 V/ \8 q2 V4 A
// youxiao_k++;
# h0 E8 [. K4 U// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
: l( B2 |: @! h4 A/ E q// /* 感觉要取21个数,即0-20, */
2 O$ h: j# H$ z$ i3 Q: O. Q// enough_data = 10;//有效是10,无效是07 L" w+ W0 J: ~ I7 E% q
// }9 q2 [, J( l9 e# D/ M, g
}# O4 u, q+ v' B7 T% r; U) u* z$ v
' J0 q5 ]9 Y( h: u
- p+ |4 Q, Y2 P enoughDataFlag = 100;
+ u. r" }, b& j enoughDataFlag = 1000;; y3 Z5 O( T( t3 W, z
enoughDataFlag = 0x02;
2 H; w0 ?% C# E$ W enoughDataFlag = 200;
5 q2 e, ^. E1 L5 a, _( u
1 A3 v) {% x6 j; z$ S7 D# c% e( e int myfuvk1;) n. z/ {3 d( w1 K W5 G
myfuvk1 =11;" e; c! H+ q* L
, r% @/ k: D4 C5 E/ b
& R: @ a# ]. G2 P+ ~ enough_data = 0;$ G6 F! G0 X! ^2 o) L( x
) E7 v& S2 @2 t ^
// if(enough_data>50){
9 ]# t: w( d* y& F b' U// enoughDataFlag=0x01;7 o& k, b1 {- K
// }else if(enough_data<50){, F3 B. f' T' y% \) F; U
// enoughDataFlag=0x00;//0x00还是不行/ x8 M$ ~' G0 H* j
// }
3 r$ w( C. K/ c0 Q
% W/ ?. @( b5 r0 k
! O6 B( S% P3 m7 n! K5 I oo=10;, w# E0 i/ \ y
oo = oo < 5;
; }1 {$ v+ H! b if(oo){
& b5 I' ~/ t, r2 \9 | ii=0;
& \1 e* o$ ?( [/ @% J/ I% c }
8 g( h9 z3 U9 e3 e# W' R/ ~) _4 g if(oo < 5){1 @2 h% s: [ |
ii=0;, v0 v! m+ g6 K( P+ s9 C7 k
}7 L; n) ~1 {" j: I
if(oo > 5){
. M* ], s+ M" i ii=0;4 U- A3 z* U: A/ b
}
* { y& p! C2 _- J
. i/ u: L' m# }, N /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
5 E: X5 {6 }" f /* 如果数据足够才执行主程序 */) K5 w, S7 }7 Y. `1 p w7 n4 I
oo = oo < 5;1 A# W" t8 k- n! k! }7 D. m4 v" e
enoughDataFlag = enoughDataFlag < 5;
- `" `8 e/ X6 f( ^2 G if (enoughDataFlag < 5) {3 T _3 a) d: `7 F! n }# {
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
c8 t3 I# E/ T& y/ s AGC_AGC(&pAGC);* U0 Z* O) Y/ Q" i4 w' F7 B3 {+ j
4 I A7 o4 Q( U) b1 a; E
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);$ o* _ f/ G' H+ U. J2 g: F1 S
FIRDecimator_FIRDecimator(&pRxFilter);* r N7 ^4 ]+ v7 n
& o( H9 h0 P8 |7 V9 P9 A! C
/* Downsampling */3 d3 t- i' j- {; T3 M) o& E+ R
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
( r# K, \) j Z+ z+ b8 z, _6 J r1 k& S( K
c_PreambleDetector_PreambleDete(&pPrbDet);+ l. ?. A4 q8 T! J9 A% d
% |1 o7 R' e0 n& |1 G& Q4 L+ \6 Z+ \ /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */$ S0 {: P' Z4 A% |
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */7 [# u% L1 W# o- V! B. g+ j
/* %帧数量=100 */
" t1 f5 ]4 a G, M" {; c/ u: | pFrameSync.isInitialized = 0;
5 P+ m7 d, Q1 C- @4 z3 `# d) v' U
$ q0 Y$ F$ l4 G /* [EOF] */
9 w9 f7 q+ m. b /* 前导码长度是13 */, ^# ]5 x: @8 n1 d3 @3 [9 C
/* %qpsk */
8 W/ o* C$ D& r* \# \, S pDataDecod.isInitialized = 0;7 k& r# w* n' }8 j( `
" `! c- b! q6 p9 r- ~0 j /* end */, G( E7 | c1 V. T6 A9 N) v. Z
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
( Y# F6 d) B$ a" ? /* Convert 3-dB frequency */
, y- `; C* g! m" F0 H/ r0 E /* Convert 3-dB frequency */
. w+ T% H8 x% x: ] filtfilt(save_buffer, usable_left_filtfilt);
7 ~! s( P' n" l1 I for (ixstart = 0; ixstart < 81000; ixstart++) {$ o5 C' V$ N9 ?5 t' r* Q
usable_left_filtfilt[ixstart] *= 2.0;
5 n& N, @2 j# X' w+ w! G2 z5 K }; h* B- J" F) u$ y& G
0 v3 w7 n( W. u( ~* r" a& J
/* 注意乘2,处理幅度 */
! U% M7 [: d$ O. V' i$ v /* %% 我发现带通之后其实就均值为0了,不用这一步了 */; T/ Z4 D- ^5 O
/* %% 行列转换 */
+ x P$ _7 U" \# B yiDuanShuJu_mean = b_mean(usable_left_filtfilt); r6 C2 M. n6 e! s, Z$ B4 L
for (ixstart = 0; ixstart < 81000; ixstart++) {
# W) \4 y7 | a1 D youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' p$ n% K/ V* ?# F& ]! E - yiDuanShuJu_mean;
7 r |9 A8 n( e ?) y }
% u! ? ?4 X: q3 d1 o
$ P% K- E% y) J) y /* %% 应该对数据归一化,但是这一步放在哪比较好 */6 w! C4 @7 D) t; Z
ixstart = 1;! ^$ Q- Z. T! I' E. _
mtmp = youXiaoShuJu_QuZhiLiu[0];! ?3 W& m$ [+ C" S0 E! |
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) { M6 j9 @% U0 y
ix = 2;4 y9 D' Z5 B( J2 I) t% z
exitg2 = false;
, M% ]5 N7 Z2 ?+ o while ((!exitg2) && (ix < 81001)) {& n S7 R8 Z$ _3 ^; }
ixstart = ix;8 D+ {. J' v) ?* Y- C2 q0 t
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {( q8 o7 Q# @/ y
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];) N$ \$ k2 r! Z3 ~' T$ O- N4 D
exitg2 = true;2 `) M4 U" y# H
} else {
) \' o" L; o0 a6 U2 T) T4 o' _ ix++;+ @: c; o1 M# _: F8 {' A
}/ ^; _ r& b- I; V3 W
}
6 J8 o% y& X+ w8 l* Q6 v8 F }' W* X' B7 L9 l! T& [
4 ?9 z. A! f* g0 Y4 [5 k# v, A; G9 f if (ixstart < 81000) {+ x7 S/ ]8 k c$ Z, E
while (ixstart + 1 < 81001) {
( ?: B, b* r$ \8 f3 E if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
- N! R1 a, b- ]3 P3 T0 F mtmp = youXiaoShuJu_QuZhiLiu[ixstart];4 O* l, I0 B8 t8 G: N1 U8 v7 K: ]9 T, k
}$ n, c q! }* z" b* {) E: g* R: K* f
# i! Q2 @8 W! T8 ~+ w ixstart++;
& s' G, r' I0 I" S1 W }
+ w1 [+ y M' q/ F. F5 I' F4 R! x }3 x1 ?% Y! g/ R$ l
5 [: ]# g/ u- r5 n9 M ixstart = 1;
q/ H8 ?% E5 _6 ~3 v; L0 _ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];% t2 X. h+ B$ o* y8 o; D& Q# G9 u9 \
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {! s3 s7 B5 E' H \) o1 A* @
ix = 2;
- \0 _' L, e5 l: z L7 F exitg1 = false; a) G. k, [% z& G
while ((!exitg1) && (ix < 81001)) {- _3 C3 y m/ H- V$ u# m
ixstart = ix;4 q; ^2 d0 S3 [! L( \- e
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
; ^( F2 n# ` l( n& K+ p7 i yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
! [' N8 Q- G, \. N- N exitg1 = true;
. q# o+ d+ X) r% i [; f& K* N } else {5 S1 N( S) f1 O1 ^* A7 D, V
ix++;
* Z$ ~& A8 l! n% u' y0 f+ q }
4 a: a+ W) a' m- _ C2 R; m }
0 Y& l' }/ s- j- O3 c }
. E* @- n- y$ Y/ {4 {4 T6 q7 N& Z( a
if (ixstart < 81000) {% A2 g. ^( U8 ?% R6 r3 ^' b& V
while (ixstart + 1 < 81001) {
" u& J1 m4 U s, { if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
& n$ }4 U k& g" }" ]0 ^ yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
( G* P& [9 Q( y6 e; R4 K: M }
! v& p; F. M8 @' S2 B) S
Z: N; R9 @3 i, z5 i" t9 n ixstart++;
- |$ Q" X; s* r; W* r }
& Q/ Q. s" t) C }
3 G e! F4 [( X9 _: L" \. f, \; G' I% Q* j2 D+ }8 o
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean); d4 M) B. ?$ j. d/ C* {" r
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {3 J) V5 g/ x" q0 `( x
yiDuanShuJu_mean = mtmp;2 j# T0 L* b; U8 E6 ?0 Z
}
$ }4 Y7 {4 a) Z6 S: y/ ^' d1 J7 D6 w" G$ \9 g/ j4 _% r z3 F& U
/* 找出极值 */" X$ Q1 W7 W: |' S6 p/ p. G% U$ P
for (ixstart = 0; ixstart < 81000; ixstart++) {, U3 w! _* Q* K5 U# S: k) {
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
9 B+ U3 v7 @# q8 i4 x! k }
, Z& |5 ^5 T! c; {- `
2 j+ I/ z& Q: g$ L( s3 K" a0 M* @ --------------帖子字数限制------------------
9 N# I z; x1 M# i" k9 w}
3 e0 o* `; |5 i$ t8 d8 V
( m9 G' a5 e0 e( @/ l# I _: v! a, y8 L! X
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|