|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
# J( ~3 a* z! J1 e5 N$ N" `5 ]' _" W; n S% c$ ~. R
各位大神:5 a9 e2 k9 @- n- X
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
% c4 c; q6 M: K 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
; q- Y' z. W$ V+ [' M* W
, E* h+ T$ m$ D# U6 w# M. w, _ & w- n5 n: O) u9 n, c D
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
# H1 a9 p5 g- G% ~' n' B; G( s$ `# m
并没有其他线程& j f# i6 C* K+ S( K* U
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。+ o' U, [: C# y0 B$ m2 w- n! T
也说不定是和堆栈有关系。。。。。。9 i7 m! L) C! t# I* D$ g* B
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数...." E% l& N" B8 i
* C9 x. s6 X! \ o5 ^% R: w) p- M7 [1 L! ~
1 F$ P+ B' h6 Q2 ^8 W. D
我也很绝望啊,希望大神能帮帮忙,感激不尽,!4 Q8 V0 e: ?" z6 D) U
3 b: P4 A& u% }2 f/ j
9 U! M( j. \ j" ?附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
0 F1 E& M0 T, i4 Z. B$ ] static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
+ _; r1 g4 j4 _6 M, T$ p- c
& a% q/ E9 q9 |( Tboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(2 d Y9 Y" e0 F0 o, l5 \* J
const double data1000[1000]) {
2 q' t8 ?: n( @. ^6 }
" \+ ], C& X4 d7 G6 [4 T int myfuck;
4 S0 W; y6 Y$ `% } double yiDuanShuJu_mean;
D9 f3 T& H6 u; C double yiDuanShuJu_LowMean[1000];
1 n: j1 p0 Q3 Z1 K ~' z int ixstart;
5 ]# O# f6 t7 g3 y double dv0[1000];
' _7 t+ S: C: b comm_AGC pAGC;5 z, F" R. N H# t
comm_CarrierSynchronizer pFineFreqCompensator;
) b2 ~9 i1 s) L. p* v6 ^/ x+ B0 I dspcodegen_FIRDecimator pRxFilter;' C5 a8 L0 ? W7 X" ]
comm_SymbolSynchronizer pTimingRec;$ O, }- R2 l' z4 ^* @
comm_PreambleDetector pPrbDet;8 e8 X* w- Y& j4 L
FrameSynchronizer pFrameSync;7 Y1 G, {) ^& Z8 M8 ~2 r; t
QPSKDataDecoder pDataDecod;: J& \8 y8 D4 ]# T& p3 k4 J [
static double usable_left_filtfilt[81000];$ s5 c h) k0 E
static double youXiaoShuJu_QuZhiLiu[81000];
* A& G6 s5 `; f; E, K* O, O9 i double mtmp;7 c( R1 D9 t1 q* L3 F- i+ q
int ix;! n5 B. n ], C
boolean_T exitg2;6 F$ x4 e- \; Q* M2 ^) y9 i5 w- |
boolean_T exitg1;
7 u2 n; } x2 x3 V8 ^8 v/ i double YiZhenShuJu[800];# @; W- @6 |# T, i
double dv1[800];0 _2 o4 t/ W) d' L! G Z
r5 E4 s- I: W( }
0 ^( r; N8 g5 e* M" u+ X double b_YiZhenShuJu[800];
( K; M9 p# D1 g) `1 ]; Q3 @3 @ double I_filtfilt[800];
+ F# i1 a; C; @# f T2 P* b double Q_filtfilt[800];
1 r( j& q. ]1 A/ R creal_T b_I_filtfilt[800]; |3 W0 N2 D0 {4 [( S
creal_T b[800];' B0 s# i2 j8 P/ }0 n5 u# v+ Y
creal_T RCRxSignal[50];
- ?# S5 e+ m3 W5 { creal_T fineCompSignal[50];3 U% K: |% n' l4 Y# W4 a. P
double phError[50]; X8 B. |6 L) | `6 `8 c4 S( _8 V
creal_T timingRecSignal_data[28];4 D7 X' G! Y& O6 F+ B( @6 \
int timingRecSignal_size[1];
8 {' Y7 a! V E M1 G double prbIdx_data[28];. x1 |% Q& p0 y0 f& W( }2 }2 v( s
int prbIdx_size[1];
2 v6 Y1 T7 o8 U& a# m! Z# L! O double dtMt_data[28];
6 Z2 h6 |& ^& }; i int dtMt_size[1];
- K2 T6 h: f9 W% U' x# A Q creal_T symFrame[25];
4 h4 e3 w! N" W+ v% ] boolean_T isFrameValid;
+ y U1 n W; H double unusedU0[3];# T& ^3 S& l8 g3 w. p2 ~# ^/ z
0 g- k7 q* c2 Q" B9 U
//调试过程中的变量
& f" k1 E: W7 x* Z. ?, I int enough_data;
# f$ @9 O F) b4 `" ?5 ]3 ]0 f$ p5 p5 m& a/ j/ C [
int enoughDataFlag;
! M8 r7 U6 B- Y( V% G; l int yiDuanShuJu_mean_int;" r0 }, ~. D% q! ~7 c
int int_sum_dv0;
) ~5 L5 q; [! y% M# c1 v int oo;" l) e3 M/ R& j3 C$ w
int ii;
/ h6 U, b4 W" j, u1 t6 f# Z" y myfuck=10;2 r! C/ R! A, n% e+ \% n0 g6 ~4 l
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
6 l$ B1 [5 v' {! d+ ? /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
1 R* k( w9 z: z( G* I" ^
9 o+ ^( |/ u& e$ _& h& x/ | e yiDuanShuJu_mean = mean(data1000);
7 q. M& m, i$ i' k/ p2 _! y& h: [' d; |6 E
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
# n/ c E8 E: A0 @ UARTPutc('A');
; h! F- b" g7 _% q0 m( z* ^# l7 a1 S UARTPutNum(yiDuanShuJu_mean_int);
! ]3 K( E4 _# i+ m0 F UARTPutc('\r');+ {) ]* n/ ]% J# X- e3 O8 F
UARTPutc('\n');3 c" J9 B+ D5 l4 i
! ~: V C) k! T3 U$ Q" I
for (ixstart = 0; ixstart < 1000; ixstart++) {
9 @2 U u4 B' i yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
* l3 Q6 Q( L1 x# ?7 P# k0 z$ z }# T% Z. V; u' Y) j* k8 p9 N
3 }' x) O3 `3 b0 E4 ?7 O: d power(yiDuanShuJu_LowMean, dv0);" R8 v S( w+ H8 R
+ W6 Z& v& m( I: E# X& T% O7 }# w int_sum_dv0 = (int) sum(dv0);
, k9 Y; C8 t0 x- s
+ Y% w- Z" X @ UARTPutc('B');
: R: c6 ~7 R& p0 U* L( }+ J/ y6 N2 c UARTPutNum(int_sum_dv0);
) G# r! H+ s! I% S+ e UARTPutc('\r');
# h" J2 G" e9 K! J, T UARTPutc('\n');
, R/ d' E0 M) l% o7 t0 ]8 Z8 L& [* H: [1 ]! C
// int compareFlag = int_sum_dv0 > 1.0E+8;
' _3 h! z6 Y Q- y- g" {( n/ {
* m; h# r3 a; J3 h if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
- f" r- \! S4 f: Y% [. X, H UARTPutc('C');9 Z2 e7 Q# V, p+ _
/* 比较信号能量 */, N0 f! F+ ^5 Y# W: |
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
5 Z n+ |) H/ n& H$ z2 {" h$ ?// yiDuanShuJu_mean = 1000.0 * youxiao_k;
8 e& b; Q6 H0 L# _// for (ixstart = 0; ixstart < 1000; ixstart++) {7 t0 S# S6 @1 ]+ v( s6 _* v
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
! m/ R4 x/ k6 N* H( Z! @: h// yiDuanShuJu_LowMean[ixstart];4 \% H' l! B& G0 W# W" b3 U
// }
Z7 ?( d6 q# E//
+ s7 ^+ v) q" }1 S/ X: u' q// youxiao_k++;
; d$ M9 T2 L0 T' l. z7 y# a; S3 T// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
" N8 R. d+ C% ?$ G// /* 感觉要取21个数,即0-20, */0 _* A. F0 N% ]7 ?
// enough_data = 10;//有效是10,无效是00 Z( P- ]- [8 W1 g" }
// }
% S! C6 N4 ?6 T/ T5 d2 G }% ~* V( G0 }4 j" F- X& {
. u# E' d+ u9 {4 b
7 ^$ J& `, h! n7 G7 } enoughDataFlag = 100;
7 i( S+ M! Q3 V" J enoughDataFlag = 1000;
1 { I! Y6 L' n' F5 E enoughDataFlag = 0x02;
) x. L+ k9 e8 P8 G) A; c enoughDataFlag = 200;( l- _& b' ]/ m3 g+ J! K& N
- I3 o# n: h, x7 B, y* n/ \
int myfuvk1;/ U _9 _5 Q! T
myfuvk1 =11;
! K1 A1 |! w% Q7 t* B( _9 d
4 ]: R; f& T8 s: U g" k9 x# n# a! [% b7 ^, L7 y( L
enough_data = 0;
, {& h$ w9 ~1 `: {9 X+ a4 p/ A* w" j' [7 v! h
// if(enough_data>50){) x$ I4 P+ g0 O0 E" w
// enoughDataFlag=0x01;
: b, a' a/ B% b G* a// }else if(enough_data<50){* t ^; F% K0 ?- e& u8 `. c
// enoughDataFlag=0x00;//0x00还是不行
; v7 Z: ~8 x P// }
/ N! ~( F9 F$ [8 y( `: {$ Z9 ]: b6 J
/ s1 R8 n) ?5 o7 A6 x
& v; c, U" G3 y/ H' h" y/ _* `5 i' E oo=10;
8 R3 J6 [/ l+ Q( J+ ~ oo = oo < 5;6 E* Z3 k' m1 {" y
if(oo){
7 O) `5 k r& @. h8 ~9 A ii=0;+ c/ v) L8 X- Z: E1 z
}
' z! D% s, ~" f" e! r if(oo < 5){; j7 e0 B4 |( ?& c, J
ii=0;& d) R9 b" Y! I1 [) X; [2 U
}
, [( f. y' _( e( W if(oo > 5){
: C9 x6 {8 z/ d6 X ii=0;
0 D. S6 _0 w$ W' Q. T) f }& B U/ O* v- G$ H/ l! B
* H2 a; R" h4 i9 t8 ^4 q3 r
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
8 W' p9 v6 F& Y5 S( Q /* 如果数据足够才执行主程序 */
% M* K* P1 l& d# ?# G. B( w/ g oo = oo < 5;0 @4 O. o" A' O, B: z1 K3 q
enoughDataFlag = enoughDataFlag < 5;1 C, J0 m( ?; O- x3 q+ B
if (enoughDataFlag < 5) {' v' c, a6 O' Y# Z1 u* |
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是07 D: d% k. f- J, s8 C$ ` I# ^' |
AGC_AGC(&pAGC);
2 G& c5 Y- K4 {7 Y& t) K- S4 b. ?9 f5 F& |- ^
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);0 x3 D, ]$ [% G+ j
FIRDecimator_FIRDecimator(&pRxFilter);
1 z, A [; E6 L" o# }. T. N6 C: v; d
/* Downsampling */
8 h) |) \; w H O c_SymbolSynchronizer_SymbolSync(&pTimingRec);; [3 x& ]+ d5 m; i- D R
5 j% U& h0 e+ n5 A
c_PreambleDetector_PreambleDete(&pPrbDet);3 s5 h4 M. d( J5 N6 m% s- ]
: D _" r/ h/ p/ C H' s/ b3 l
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
3 K$ J' l" a. N- I. i /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */& g* B1 \- i4 b# ?- k w o/ k
/* %帧数量=100 */: `8 C5 O6 u4 k# |
pFrameSync.isInitialized = 0;
5 C5 l0 H. W! `5 ~; Y, s4 z. s) k, x' ^, M
/* [EOF] */
$ g* h7 a. v; L/ n, X' ?5 ]( a /* 前导码长度是13 */
2 W/ Q$ C( }$ k: z' f) W$ { /* %qpsk */7 d7 \0 E4 I7 P8 O7 V
pDataDecod.isInitialized = 0;1 s% g' p$ k0 M% F3 S" U9 c
: ~* ^6 R C5 I2 Z5 A/ n* `" Z
/* end */
- k$ R. e8 f& q3 [1 m6 F /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */ d- P9 y" ^, W
/* Convert 3-dB frequency */& r9 {$ V9 K6 o+ B
/* Convert 3-dB frequency */
& c: K2 C. `& F1 l- |" ?2 @ filtfilt(save_buffer, usable_left_filtfilt);
* w% H3 V2 @7 J% ` W, X for (ixstart = 0; ixstart < 81000; ixstart++) {% S+ _% ^2 n( v' O
usable_left_filtfilt[ixstart] *= 2.0;
( p* s% ~" X3 y. o }
6 g& s8 S( h" m D& _
5 u4 K9 h6 |; [/ m /* 注意乘2,处理幅度 */6 T: H5 M5 b! {# I
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */; |5 h @ F+ Q* v }% l* [
/* %% 行列转换 */' c, V; E1 u& d7 s" R9 Z' f
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
( R' [! ?2 e; L$ U. W5 _" R for (ixstart = 0; ixstart < 81000; ixstart++) {3 f G/ `0 `2 |6 E$ u
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
1 J' }# |8 |9 C& o8 e! F - yiDuanShuJu_mean;
: X8 P. k; n) h. Y3 s) z1 O3 r }
1 X/ a+ M$ T5 k0 f/ ?, H2 y* k( M; w: A4 Z& a1 T9 S
/* %% 应该对数据归一化,但是这一步放在哪比较好 */+ U5 }2 U% W: L" K1 S
ixstart = 1;
- k7 \5 D7 E5 E6 g9 |) z9 p% T mtmp = youXiaoShuJu_QuZhiLiu[0];
3 R9 j$ ^8 v/ F" F& c# ^/ v* ~9 |: Q if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {: {0 t7 k9 v! B$ R! K& ?
ix = 2; @; o# i7 Y1 N% V! G) K0 `
exitg2 = false;
0 |3 |* d1 z6 U! b& j while ((!exitg2) && (ix < 81001)) {+ K/ k9 u. z: j* \
ixstart = ix;
0 h8 j3 { p; j$ X' D7 P if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
% N4 k4 x' }4 R mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];+ j9 ~7 |: v1 }
exitg2 = true;
" ?$ d! l3 @: |& ^( l+ _; \* p } else {0 D' H- F0 M) j" d. m
ix++;; U5 k2 |" r6 V, \1 D* Q: G
}1 C: G/ m$ x+ T
}7 k/ p; L) N8 @; @
}
# a; E% _/ E8 u' R% R; y
0 X& j% a7 `* v7 q& g* b if (ixstart < 81000) {# d+ Z; @2 Q8 S9 j, j) n0 I& c# a
while (ixstart + 1 < 81001) {7 Q/ X9 @, Q' H, R5 d$ C6 r
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
Z1 O l; U' }' i9 l/ p' u. d' J mtmp = youXiaoShuJu_QuZhiLiu[ixstart];! m9 A& {, V8 o' N( D
}
" A' n% x9 R1 L* D+ @3 V0 w+ O7 }8 |( V* B! U2 U' ?' v$ k5 Y4 |
ixstart++;
# }" R9 c9 m& v7 \: H; W, k; x' g# r }# N2 P0 O0 q% a
}% I7 {/ K9 I$ p- G
. {3 V1 y+ S; J q ixstart = 1;7 k5 K: S$ m B2 u& G0 J/ w
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
5 b M3 e) `) j' x4 y if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {- \8 u8 L6 ~! h7 f
ix = 2;1 O! z% e! [ p+ D- z. w$ E
exitg1 = false;
6 V! b" W }2 H; N- Y) D while ((!exitg1) && (ix < 81001)) {6 Y+ J9 w5 a. ~& l& N& m
ixstart = ix;
- X. K \2 t) I3 x if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {% y: q' h) Y4 d8 O& w
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];2 C( v9 `5 W8 S) ]% c# {
exitg1 = true;
6 ^( N2 d% i: S3 B g3 M7 a) T1 ? } else {
G# u e7 P& s8 @# | ix++;
9 @: C( V5 d' j9 O8 [: z }$ D6 ?; D, U! `
}
9 ] _; S5 B6 ~. f' G }; a, m. }! X- A
$ N9 l# t7 o: A& \. A- p if (ixstart < 81000) {9 L" f/ u) v2 \% c7 P: X
while (ixstart + 1 < 81001) {
7 H/ q& ^ I- e: i M1 ]# U# c if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {' ~- ]% ~4 ~1 Q, v4 Q2 K1 f7 s
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
3 o4 A% {6 t/ I2 B2 p, ] }
8 [# O: C1 k) p ^5 X4 W" |1 ~7 y, F4 p0 g4 {
ixstart++;! c- w- E4 O- @ y2 b7 u1 {
}
$ _+ t: T( G o7 U- p }
% y) [6 h& | k' t
/ T5 |8 h- g8 P9 F( J yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
# ]/ l' u# q8 t" N if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
$ M T2 J* d* G! q D yiDuanShuJu_mean = mtmp;- G( a7 n: T. F3 P5 l$ u1 ~ ^
}
5 Y# g2 ^. a' J# {" S
' @& D1 t9 x& o% _% T# R+ N4 P4 _ /* 找出极值 */
6 I% u: G$ O* j for (ixstart = 0; ixstart < 81000; ixstart++) {
: Q7 @9 t8 K: P; m youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
1 m5 H/ v, w w" X+ V3 G1 D }; L$ r, h& H7 D4 ]1 B
; P( N9 x b) R, z' X) X0 b) ]
--------------帖子字数限制------------------
0 C8 h2 ]5 T! `1 }$ Z4 B% F}
! N2 ]- @1 r. A& K* V! w& F
5 _- c" \& s; h+ D: t7 Y7 W
; [* F( ~- L' J" C5 K# n |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|