|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 - X: d+ N8 t) c# K n* L# G
?& }! @! j/ B, ?& ?: I- s各位大神:% P! o2 ?$ @& Q" ~
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
; T1 D1 V; A/ J+ g! l 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:! n0 y; c1 d; Y
9 u* t7 f. S/ Z
% b) x }7 Z( S! S' g1 [这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。& i* [3 X0 E) Q1 ?9 I
) z) c" }9 Y1 V( P' |) M并没有其他线程
c4 Y: d2 \. @; y/ C反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
, Q7 ^% u- x( _+ J; [也说不定是和堆栈有关系。。。。。。
% W f6 S0 G3 ~+ Q0 x请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
2 }" L6 p y; _$ U- F/ b0 Q6 A6 v* v
3 ?( e R8 }& _; d
( u' o& e5 u! s! p5 {/ I8 ~& o
8 D. k2 y/ o3 B- ?. g- z/ }& d我也很绝望啊,希望大神能帮帮忙,感激不尽,!, Z3 j5 I$ a# K @ m" {& x
B. |7 I: D6 D: ~, ]
8 a9 W( R; j( w4 n, w7 o附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
# `/ D0 }! X8 r' e) b static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
% s6 z0 k7 g3 i; a1 l/ H3 ?" Z" W0 @+ z4 _1 a+ x( }
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
' t7 Q2 s/ c+ [1 J& O4 X const double data1000[1000]) {
" t7 A8 c0 M; C' b0 f
" X$ i$ v( n0 E: U" P3 X: H int myfuck;. K5 ~8 K0 Z A* D) J
double yiDuanShuJu_mean; f) o4 [% g6 y0 s) @: x# z0 i
double yiDuanShuJu_LowMean[1000];
7 h! Y" o4 _ S1 A* B6 H( } int ixstart;, J( h( c2 Z! a6 O
double dv0[1000]; _0 x9 y Q, k6 g
comm_AGC pAGC;/ y9 t- N: ?7 e m
comm_CarrierSynchronizer pFineFreqCompensator;2 H' w6 |, d1 S
dspcodegen_FIRDecimator pRxFilter;: L! n0 ?9 b2 d `$ p5 i7 T% g
comm_SymbolSynchronizer pTimingRec;
8 s! d4 ?: _( H! y comm_PreambleDetector pPrbDet;% E& H# L4 k" q0 M5 J4 y) j `
FrameSynchronizer pFrameSync;
0 Q' d7 h7 d# ~/ Z& h% } QPSKDataDecoder pDataDecod;
4 |7 @/ p+ j: w# ? static double usable_left_filtfilt[81000];
: d* [7 W, E/ l static double youXiaoShuJu_QuZhiLiu[81000];
0 I1 R: P4 U0 v( e/ ~9 q double mtmp;
$ K$ D- N0 X5 S# b) H7 s1 Y7 w int ix;2 E Y& H3 ] W8 z8 r4 D; Z$ N
boolean_T exitg2; [! n, |8 l: W* k2 O
boolean_T exitg1;
$ N( Q' {* ]: D; w double YiZhenShuJu[800];, F( k7 {4 f& f3 D& n
double dv1[800];7 s: Y T9 ?( c
" z( ?" K w/ h) Q0 [, |. A7 ^( Q" ^
1 F% S# f9 x4 K5 d
double b_YiZhenShuJu[800];
' l6 m. y+ H3 H& L# G s0 O# n# F& A double I_filtfilt[800];% x6 q2 s, b7 T8 T% }# C
double Q_filtfilt[800];7 I/ Q, q% |5 _3 L5 X, s$ r8 z
creal_T b_I_filtfilt[800];7 h+ f2 |% ?; \
creal_T b[800];
9 _1 d, t" `8 I creal_T RCRxSignal[50];
' q- S% ]1 |9 q! q; K' g creal_T fineCompSignal[50];
) ~: B% f& | \- u0 G6 Q7 Q8 k: ` double phError[50];
) d `) N; w# t5 A% W$ G1 X+ d2 a% {# ] creal_T timingRecSignal_data[28];' f+ x2 M% y& y, k* J5 H
int timingRecSignal_size[1];
/ x: l7 Q# j( u0 a: }, R( ` double prbIdx_data[28];
8 P& H9 H% N! _* L8 l# x: ]3 ^ int prbIdx_size[1];. z9 y7 P5 q7 M* M3 U6 d% t6 |/ q2 P
double dtMt_data[28];6 W' K. ]2 U" l% `2 l F0 Q
int dtMt_size[1];
* }: l o9 N6 z. y creal_T symFrame[25];2 p: ~/ E" ?& x6 F9 U
boolean_T isFrameValid;" J" v5 m8 W5 ~2 M2 V; N
double unusedU0[3];
3 V3 @; T6 A' f% o4 i5 r9 p; G, i# U# _0 y6 ?/ e
//调试过程中的变量$ }4 J( u1 ^# T/ `) @
int enough_data;
) V, S. f- a$ Z' N' o: U% Z4 O: Z
. M+ d( {7 H/ x- p" Q% E$ c int enoughDataFlag; R: \! |( i% |1 R
int yiDuanShuJu_mean_int;
+ j3 E5 |5 ]$ q$ n. w+ f5 A, v int int_sum_dv0;! T6 q+ G6 q0 L7 ~5 |' L) _' N
int oo; c: w5 z. ~2 Z' V
int ii;2 \! Y6 K4 _6 R
myfuck=10;
6 {8 p3 r/ o, e. N, A( u /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */ {- t+ E% i1 m
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */" L- q Z- X$ f" A+ h' b8 }
7 C \* F5 Z8 o; p% f( d yiDuanShuJu_mean = mean(data1000);
) g2 Q- a+ d& }( {: O. t/ h& Z' `0 T8 V8 N8 O0 ~! |! X4 f
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;7 K: N) P3 W$ R+ {, s
UARTPutc('A');
/ O8 J) b2 O0 P9 P. d) E! L UARTPutNum(yiDuanShuJu_mean_int);+ t J! a+ p6 X! E z. ~! b4 R
UARTPutc('\r');# w( q2 _3 _7 |3 W+ }/ [
UARTPutc('\n');+ E* y0 L4 q! K1 l
/ b) e, \# Q' f- _8 J& _
for (ixstart = 0; ixstart < 1000; ixstart++) {5 T0 c2 ^3 L3 w- p3 {" b( p
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;$ {8 M! E, F; R9 V2 o$ c3 G; H1 o
}
' \! @+ R: n( L% J. q* s4 P# j/ G5 Y' C' W% B
power(yiDuanShuJu_LowMean, dv0);
" ~ `7 B, T9 ?' U5 j1 N6 }2 P1 q
8 c7 i8 u0 w( u2 ]+ r4 O int_sum_dv0 = (int) sum(dv0);
1 }' _8 j' _! J' G% S/ e, ^- |! @1 t+ w* D% N% e) U" N
UARTPutc('B');& w+ n7 [! N$ t
UARTPutNum(int_sum_dv0);" s) u& f: X Q3 l2 l L8 z
UARTPutc('\r');3 B; h% |; M, J( ^# `
UARTPutc('\n');
. M! |) [ u' T$ j; `) D; v$ U
" g0 u2 O2 Z9 @0 s// int compareFlag = int_sum_dv0 > 1.0E+8;3 W& [( c% e3 X
- r$ }( ~9 k7 F& n5 }( y
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
+ J% k2 }# T; Y UARTPutc('C');
+ c3 g6 g% F1 A! ?8 c+ F /* 比较信号能量 */$ ?( k$ C4 i- z7 D/ D2 v* d
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
$ @- r5 U# f: v S// yiDuanShuJu_mean = 1000.0 * youxiao_k;% H C+ ?1 P: K7 d9 x
// for (ixstart = 0; ixstart < 1000; ixstart++) {' X, P* N9 u# ?( s) Z
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =, o1 {5 n/ r$ g' a
// yiDuanShuJu_LowMean[ixstart];
% g+ }) ?: u8 o2 i. f) d1 W// }
+ M) n* j* }8 t" T; ?& c//
8 [7 k) e+ Z# `* S0 L$ T; l) a3 y1 G, }// youxiao_k++;( K2 b% w8 X$ G6 F' e
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==& o! \# ?) L% ~7 X* s( O- b4 \
// /* 感觉要取21个数,即0-20, */- A3 p% i; I5 D. g6 v
// enough_data = 10;//有效是10,无效是0
! {* o, c/ a/ `3 d y// }) b$ g% I9 u# |. e4 K0 c L; F
}
* r4 l& _ q' M3 {$ x, t |* a \) a& W2 _/ M
7 Z9 g4 ?$ M* y$ c# f" d' Q1 v. V enoughDataFlag = 100;
/ d8 M" V% O7 J5 i! r- F: T enoughDataFlag = 1000;
: O- D) |3 n: J) e0 @! j7 W enoughDataFlag = 0x02;# z% n0 @* M1 [; ^- Y
enoughDataFlag = 200;. \7 ^7 y" T0 K$ ?% H0 ^- Y
' t8 H; C! y. w$ d& ~1 z
int myfuvk1;
' |8 b7 a4 G3 J6 l% f) S myfuvk1 =11;% C* x8 i3 |+ l0 B% e. ?- C
$ N5 m) }9 U }; V+ @7 G8 u1 {, N+ n; b9 A( E' M% `1 w
enough_data = 0;. O$ \5 x, z' {
$ G- g$ `3 F2 Y# I. M3 q. O// if(enough_data>50){* k* ~' T# o, w; \9 b6 I+ `
// enoughDataFlag=0x01;
3 u. Y& V( {8 t1 q// }else if(enough_data<50){
. m, l( l6 X; [8 Q0 A, J// enoughDataFlag=0x00;//0x00还是不行* d; O4 x3 g* I. t, {8 `) T
// }. Z+ G+ i3 A8 o5 ^- `! t: {
1 Y; X: c3 X4 o* t s- L
6 V8 w7 |: |- T2 _
oo=10;
7 ]2 N( P6 c0 a4 J# S oo = oo < 5;: t; U, D1 Y: {+ E
if(oo){% ?; t7 B. b" L) t* m
ii=0;
2 \7 e' I0 [% }/ S8 M% e: _( r }
; N. K8 d8 _( l. y if(oo < 5){
6 O: A. O7 \4 i& N' `8 f ii=0;1 h, V% d' t; f% d! h; b4 C
}) Z8 r. N( Q& U* i1 l& a
if(oo > 5){/ m8 w [% h0 x. f
ii=0;) r% s/ `/ s; M9 h8 }. Z+ a0 D
}8 c& O. x0 s+ u' y# V' Y6 ]
# r/ Y3 W& m/ ~/ W' `2 j2 ^ /* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */6 V: H7 J, ^# B( O+ v A/ s/ e; T
/* 如果数据足够才执行主程序 */
; X3 n# [$ a( u, q' v6 ^7 z oo = oo < 5;5 B/ h5 I( [$ _# W- L; D
enoughDataFlag = enoughDataFlag < 5;) p$ Q9 {/ C5 K' \5 o' s! r( x& W
if (enoughDataFlag < 5) {
: A% g; t9 F7 ~1 G% m3 q1 |0 f// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0: X. ~2 h- v- r! d
AGC_AGC(&pAGC);
; I) F9 o) P1 F" L
$ A2 _9 g, X! U9 M2 K' J9 A c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator); Q `4 S8 l# S5 W. {$ U
FIRDecimator_FIRDecimator(&pRxFilter);5 R# o( @" m' t, A( f" ?- W. ^
^$ J' l) a3 h6 F5 _$ s* A- T
/* Downsampling */
) C& ?: b9 Q5 }; e! L c_SymbolSynchronizer_SymbolSync(&pTimingRec);
+ M3 {& ~( W. p* W8 ]# W
$ ^' l0 _4 h6 V& P c_PreambleDetector_PreambleDete(&pPrbDet);
h$ b7 i" [) ?% W# S* C: T7 [- x, c7 y L O: N |4 i# g# {. S
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 *// n y2 @1 c9 [ ^
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */& x2 }3 Y2 q! F
/* %帧数量=100 */8 y1 {4 u1 `, |* A3 G
pFrameSync.isInitialized = 0;9 E9 d! E; d( V; z7 k
' z, L P- p1 D /* [EOF] */
3 U# F* T; V1 M5 x B9 H( g2 m /* 前导码长度是13 */
6 }: m+ e* @+ H. Z7 _ /* %qpsk */
6 T( w" a- x' I9 ] pDataDecod.isInitialized = 0;7 t6 I9 f# Q2 K; i
0 _, a8 A z, r: X' i: k! L$ k, J; V. a
/* end */) m3 A/ ]+ m; D- o. W# k6 |
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */. X* M" q$ F+ ~; a" R0 ^& t, o# z
/* Convert 3-dB frequency */1 K/ G* X! J8 G: x) V4 q/ w( A
/* Convert 3-dB frequency */1 [8 d" t: q0 j, V
filtfilt(save_buffer, usable_left_filtfilt);
% d3 c& a3 Y$ Y- V for (ixstart = 0; ixstart < 81000; ixstart++) {
( ]) K! k/ O1 q5 x* o7 J; _$ | usable_left_filtfilt[ixstart] *= 2.0;
5 v% L( I+ g$ P# L' T8 @+ }9 l }
0 m' x* Y* o/ l( I) S3 n5 t
/ W* r! ~; [# W: N$ D /* 注意乘2,处理幅度 */
, e4 e+ N5 r0 F+ \" F6 c- R /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
* k9 e* X7 ^5 J /* %% 行列转换 */
7 [) C6 G3 ~" ?+ o) F& d2 i& b! C2 V+ y yiDuanShuJu_mean = b_mean(usable_left_filtfilt);0 w" T5 X# T' u6 p7 ]& K
for (ixstart = 0; ixstart < 81000; ixstart++) {
$ X' e& |4 x- i9 ^$ i" |7 C+ t youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
' t+ L4 P$ \- t - yiDuanShuJu_mean;
2 F8 Y. u {. O }7 g5 g% T- g% Z% U: I, D, h! e
( W6 S9 [4 r8 F6 S& L+ a /* %% 应该对数据归一化,但是这一步放在哪比较好 */1 m0 \4 o- j! w: p: ^- g# I
ixstart = 1;! M2 h: W6 U: w2 O
mtmp = youXiaoShuJu_QuZhiLiu[0];
5 N. m: T; p# L1 G$ r% g if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
- S4 d( ]- ~8 z: S9 U" ?. P ix = 2;7 q$ J+ b3 U6 V' q4 S
exitg2 = false;! C6 {6 ?& b' b+ Q z
while ((!exitg2) && (ix < 81001)) {
5 x6 X; V4 @, \ ixstart = ix;! e. O; e1 W0 G
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% B7 C7 `! d3 }7 X/ g( E
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
: M3 Y% h j! P6 v* v exitg2 = true;1 t" o- b; v& u# |2 A' ~; E9 f
} else {4 ~# y) ~ S. L+ f
ix++;
- f9 C! c7 E8 I f7 y; F- f }7 A2 a" D1 `1 c+ S! j; O X
}
* `, y) @9 R- A- W }/ B! Z5 K6 a- s- {0 K7 K5 s; Y
+ ^: q' G) r7 M1 J8 c8 p; \- C
if (ixstart < 81000) {1 I# p7 j2 w5 I
while (ixstart + 1 < 81001) {. ]' g. u8 F0 u9 F5 p- p
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {/ _6 D6 K* d, i; S1 u4 C- E, N# g
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];& \5 N# H, p, q# |. m1 ?
}% f: G/ d/ J! y/ @5 ~ t
9 H6 l: p; X: A: c8 q ixstart++;) ^7 `$ t: j0 Y+ Q, `, g/ e5 [
}3 I ] R$ N ^) `% C
}4 M9 X* h [/ X
, e+ d+ Z: ?: C4 E ixstart = 1;
: @3 j/ b! N) B. A; D yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
! o5 L+ `$ o: M V2 K if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. M& p$ m4 U$ Z, t" }
ix = 2;
5 s* @0 U. w: i N; p4 p exitg1 = false;9 H9 g4 O; j/ L# G1 Y4 c
while ((!exitg1) && (ix < 81001)) {
: o8 U) }; N+ C9 m; R; D" J5 v- q ixstart = ix;
6 |: E: r! z5 N' P f# q( r if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {: p0 f/ @* F/ f x3 T
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];0 T/ c5 F; x1 {$ {0 D8 e, [# I
exitg1 = true;
" b; a# O- m3 x } else {0 V* X& m0 V/ }8 n
ix++;
+ q' e2 |/ {; K }9 K; H1 i/ e/ S6 g
}
' B; e1 p7 \* d. s9 {1 L, I }
6 |' U" ~, j7 y0 X, m# i
8 m2 x5 Q8 l% n1 j. T if (ixstart < 81000) {
. V- L3 @* [( g. M% N while (ixstart + 1 < 81001) {2 j5 p4 j& T! w7 I. A, p; e# m4 Z
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
/ q8 r6 f4 s& ~9 k- K% @& R7 z yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
( M9 g! P0 T5 U }$ Y, r( u/ s+ L* F8 M- S: e
* C4 N/ n- K. O: c, i
ixstart++;
* j( w* y! L* M+ w7 { }5 L) L P8 U9 [% J
}
: {* g N0 E1 u
1 y& Z ?4 r, ?6 s9 Q0 u4 B+ h yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);; S1 D) ?# F5 j+ ~4 N) Z* I
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {+ X8 n5 B+ }! n/ a; B t+ l
yiDuanShuJu_mean = mtmp;1 n* u4 D; r6 v$ V8 q
}. L6 w# D Z! j% C2 w
# [" Z. F/ X( i! J1 l% k
/* 找出极值 */ Z/ Y, M3 }$ s! q. b
for (ixstart = 0; ixstart < 81000; ixstart++) {
0 k! E+ \+ g' K, Q- @ youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
9 _2 F- _: n* I4 W! j' a }
$ B) C" k, [( {! I
& G9 \9 U! c& P k$ R2 Q- R --------------帖子字数限制------------------
% h$ }' B0 x) [) S6 j7 V t7 W}
% L* o+ y" L" x2 L2 t
! n `( o+ q0 n$ C$ T: m! O. R: g- ]9 b1 f
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|