|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
+ T/ X/ F# n" n; k {6 s( O+ _/ ~& t/ O9 u
各位大神:
2 o6 j+ B% w+ k4 K: j2 Y6 R; R 你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)$ v+ y4 w: l* n) v5 _0 \5 n
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
* O" Z1 e" c6 K7 d
% Q3 X# E! v+ A' R
) B$ n/ G! o d: b1 [这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。 ~1 M% I K' M! C
0 c' W; u& I; Z9 N' s
并没有其他线程( ^6 K; D8 t% y7 e& R6 F
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。9 A$ m6 W+ C" s& v6 X v
也说不定是和堆栈有关系。。。。。。1 |# k/ \( ]: z) p
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
# v% R& H( Z/ ~0 A$ Z
, J+ ^0 M3 @ C1 i7 y3 a }7 L/ p/ \+ r8 v( T+ m8 b, A# v
( L7 T, {9 @# R6 k4 e我也很绝望啊,希望大神能帮帮忙,感激不尽,!
$ Q: r# @8 A! Q O( x
0 D6 ?7 r, n% F3 z7 [! t" `; i
; P c7 O( J! T/ i附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
( k: K3 f4 y0 P& H- ^0 u static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。$ d3 s3 g- n/ T7 x! H9 V5 @
1 \) c, c3 i# v$ z6 dboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(% H5 o( y5 h* h/ L) E
const double data1000[1000]) {7 w0 w6 C/ G) k( _, J( g' K" R$ p
6 N) [5 v$ {$ O4 @' ?0 S4 I
int myfuck;
9 z- w y$ v P- {. F' _ double yiDuanShuJu_mean;. r0 L& n! r+ J2 w$ H" w
double yiDuanShuJu_LowMean[1000];& T- F: V/ y, b z
int ixstart;
% P& |; M z$ z double dv0[1000];
+ f" V# Z! o7 p& E7 u comm_AGC pAGC;/ k6 o) R G6 N
comm_CarrierSynchronizer pFineFreqCompensator;9 [, N1 p4 E$ L5 ?, P1 K# w8 T+ [
dspcodegen_FIRDecimator pRxFilter;
3 |$ ]! N( ]5 U, M comm_SymbolSynchronizer pTimingRec; K/ K9 w( F4 {. m1 F; U
comm_PreambleDetector pPrbDet;
) i% O9 {: J* t4 G- N& P2 E FrameSynchronizer pFrameSync;
+ J# F& k* L! A# ?: e QPSKDataDecoder pDataDecod;! n. ^( Z7 h' y& S* Y! E
static double usable_left_filtfilt[81000];
3 M) `" P0 z- e" u static double youXiaoShuJu_QuZhiLiu[81000];
8 g- v( A, h) D9 ^+ l double mtmp;
* V- H0 q' C6 _/ v, T/ W/ Z int ix;
, G A. @2 y r% n/ } boolean_T exitg2;# L1 M; y" J, O+ w1 L N
boolean_T exitg1;
) ?7 ^% h% z' Z. K' y) n# }$ u% q double YiZhenShuJu[800];7 O7 ~& |! ^; q1 T& c
double dv1[800];( b I! H* J: d
1 z/ W' Y7 M1 L# E5 k0 A
3 @+ }( C& M! r9 }, O; }) p double b_YiZhenShuJu[800];2 r2 p5 B# B9 A% _
double I_filtfilt[800];
& y; A/ X, a2 C$ N) a0 j/ g double Q_filtfilt[800];
$ J0 x7 W$ K2 [1 n% q8 a8 ~ creal_T b_I_filtfilt[800];
- X. Y7 [8 G8 y, F8 U- M! r creal_T b[800];
9 L4 C! _/ m2 }% L2 Y+ @ creal_T RCRxSignal[50];: @) n: Z" _, }* q
creal_T fineCompSignal[50];
+ a) n) k9 V" W. w double phError[50];
" j' C3 W& K' ?5 j0 J2 Z creal_T timingRecSignal_data[28];
- \. k' ?; `/ p) M% b7 | Z int timingRecSignal_size[1];
4 D$ U2 T3 s5 u double prbIdx_data[28];
- E3 a* N5 L# R% g% t8 {' D int prbIdx_size[1];
# c1 t7 f7 h: [8 F0 _ double dtMt_data[28];. K' D4 n7 y f0 ]
int dtMt_size[1];
2 T* ?6 G6 T" e# j creal_T symFrame[25];( ^% `: W3 `% ^. ~+ n
boolean_T isFrameValid;4 }6 r) S' r$ C2 l4 d5 K0 E) o0 a
double unusedU0[3];# u [6 r1 R o s( y; O
8 r" V6 M! w( Q* L: c. C. X //调试过程中的变量
% _" n$ s9 \ R1 F( X/ H int enough_data;9 N1 t" C7 x$ _! W4 [' A1 K9 z' c
" H% |7 i% C9 z- X! p
int enoughDataFlag;$ z' Z T. O' L% l) J
int yiDuanShuJu_mean_int;2 T& }' @& P3 D* w
int int_sum_dv0;
/ ?8 O2 F; P; B% D: r int oo;" q2 u8 p% Q2 D, b2 |( M9 R# T
int ii;
1 L+ g8 M0 R! ~- V h& v8 G% Y myfuck=10;! \% h2 B) W n, C# n+ m
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */- L: X/ p+ b5 r7 M) c5 p
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */, z! U) |, h& q* t$ G6 p
/ m# ?; c' T/ ~( A3 o yiDuanShuJu_mean = mean(data1000);) e8 y N6 |$ q! @
1 h, `# L1 e, x# S% S3 V
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
) r0 c* O: W& I UARTPutc('A');6 h8 f2 Z5 c. d9 z- k
UARTPutNum(yiDuanShuJu_mean_int);
5 `8 N+ b! u* R* n2 N, W5 z& l" n UARTPutc('\r');
( W; W5 o$ v: j8 u UARTPutc('\n');
1 {. u; S+ l5 s; R ] J$ z9 Z, Q. F' C. ~2 n# Q( M
for (ixstart = 0; ixstart < 1000; ixstart++) {- W4 Z: i) b9 {7 d! l) I
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
/ q: U# g8 n2 s }9 @) Z' S( @8 j X! g
. L4 n! X* t2 U/ G, W' X1 D
power(yiDuanShuJu_LowMean, dv0);( v' \+ y. v6 S* P! x1 M' S
. H. c E2 y) D: q3 y% }
int_sum_dv0 = (int) sum(dv0);
6 ^! c' a3 g" |' C. F- g- W5 l4 S( |$ Q. |, c6 |$ Z4 x
UARTPutc('B');7 m; ?% q+ ?' K# ]5 n# f
UARTPutNum(int_sum_dv0);- I7 u% _* j6 r3 e) u
UARTPutc('\r');
' J1 F& J) {+ X. v! h2 `# p UARTPutc('\n');
$ u g: ]# ^* G. i$ V1 T6 Z) l; `+ ~4 r
// int compareFlag = int_sum_dv0 > 1.0E+8;0 y" ^; u5 i o3 ]/ _
" _. X9 Q: B4 R1 n; R if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?, ` ]$ k1 z) Z1 w& u! G9 N
UARTPutc('C');
7 s' y. |( U& ^. p5 t/ G /* 比较信号能量 */
; K1 t. ?/ _. j, l: w /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
9 k' f4 [+ ]6 W8 l// yiDuanShuJu_mean = 1000.0 * youxiao_k;8 {6 O; A) H. [, G6 _6 \
// for (ixstart = 0; ixstart < 1000; ixstart++) {, o; z2 \/ l+ R' H- I
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
# _& m6 }5 ^$ C' ?' o// yiDuanShuJu_LowMean[ixstart];
$ |0 [+ _+ [8 l: I3 C6 ` D+ N" w// }1 X7 W: J% O% h9 Y: ?+ z# b
//
: }/ O" T2 P; D1 f s6 T D9 v// youxiao_k++;0 t7 X1 c; L' Z O6 O+ N
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
! Y, u% q! d, B7 j% X# M0 K// /* 感觉要取21个数,即0-20, */
9 N* u; l# @$ ~" Y// enough_data = 10;//有效是10,无效是0
3 |0 _; M5 g5 \// }" E7 Y) ^4 X5 m, J: ?
}
' H; m9 _; M6 I; X- D/ u% i/ e g3 ?3 E4 B% c. t1 M
8 f, E2 w! U9 A: d$ @
enoughDataFlag = 100;
5 h4 F; `& r, v: w, n8 P5 v enoughDataFlag = 1000;
/ e+ [" U# ~5 a! \ x enoughDataFlag = 0x02;" u6 j( _- A+ g' P# _- G
enoughDataFlag = 200;
{3 W' t- X" L$ o. J4 S- j9 Y, B; B4 m( ]8 X2 H5 {4 `* R
int myfuvk1;
2 |0 ~) _1 S6 ^, F8 c. ]1 { myfuvk1 =11;
9 w, E5 a/ N! [8 M' H, m- A- X! ]4 M2 l; }5 ~2 V5 b
7 F9 h) U7 A0 t3 a# T5 X/ Y$ j
enough_data = 0;
- x- i+ B7 a0 a h$ Q
! j$ s+ G! f0 @ B. p// if(enough_data>50){ \0 y2 l W3 y! @# h. s
// enoughDataFlag=0x01;" j0 |' U( V, x. F' f% {# z' g
// }else if(enough_data<50){4 F: P( s, f, [0 Y2 K* H+ | l* \4 s* v
// enoughDataFlag=0x00;//0x00还是不行
v, h! i1 w5 Z; J# v! d1 U// }
9 _# P% n+ i; @8 N: f3 H' C2 r# }% b& K5 l( o. B
2 n6 J9 ` e! o6 m0 t' V l7 H0 S1 S oo=10;
2 l" n9 A. J4 j& {5 s$ T! k% L( y oo = oo < 5; W4 E3 a$ ^9 Q, _7 q' D
if(oo){+ g# e9 B6 {" d+ O4 Y
ii=0;
* `2 j) Z% ]0 G. J* u0 M7 D }
" l. X2 F4 |5 g if(oo < 5){( C& Z" ^0 V! U/ t9 Q" }* w1 U
ii=0;
, A- p# X O# o# D4 v }
7 h- m3 F. q) Q6 J2 O7 M if(oo > 5){& ^* }3 e/ {& X+ w- O
ii=0;
8 d, ?0 Y' H) v3 O; p }
- |/ q) I( y* _+ o/ |2 Q; @+ ?9 y3 {5 x5 d& v) y5 r
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */4 }" G# T% y' m/ _; f9 u
/* 如果数据足够才执行主程序 */
& @( X5 a, r3 j, ]1 j* w$ m oo = oo < 5;- K9 e5 [7 e$ v9 f3 r
enoughDataFlag = enoughDataFlag < 5;, y& u, n* ^3 }2 \' }2 `" A- N2 k
if (enoughDataFlag < 5) {
0 d/ {0 g3 L6 r2 p' s+ g3 I// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
- _9 i# @: C; {/ w9 N* a AGC_AGC(&pAGC);. _8 O* Z- {! o6 P/ R3 [
8 ?' g7 ?. y" T/ Y0 B c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
. X5 r- A# ~2 s% g+ ]+ R FIRDecimator_FIRDecimator(&pRxFilter);9 N; ?/ Z# p9 `; w. g3 g9 G6 p
0 a8 S( e' r# e( C. {8 J
/* Downsampling */" {) @* _; m- H y9 N" |
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
9 t e8 r& z) d% o2 J" j8 ?* w% y' ~9 E8 F
c_PreambleDetector_PreambleDete(&pPrbDet);
' x% @' _" Z6 e6 B' W a) L5 a* W; g0 h- e0 R3 m
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
& C- W; R% T" A- r2 C /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */9 j/ c2 a0 L/ c0 N! o
/* %帧数量=100 *// O8 w1 t8 B3 |5 b! e9 R8 ]2 \
pFrameSync.isInitialized = 0;/ |; m9 w d+ g! ^
6 ^9 h: k# J5 w
/* [EOF] */
1 k ?- F) W3 j( M8 P /* 前导码长度是13 */
' a/ j7 ~! p1 X% a, q5 X: @! P* W /* %qpsk */
( f0 N4 p6 W3 L) P$ Y) S5 j pDataDecod.isInitialized = 0;
3 M9 Z7 c- ~; I$ c! o5 ^1 h, P$ b( I
9 d/ I& p/ r0 C8 A8 [ /* end */6 C5 V/ C9 [& u) i( y! l% _3 w* G
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */3 h# z! ?, r9 Y5 O4 {5 [. D- m! [, |
/* Convert 3-dB frequency */
G: a1 T F2 j9 H# m) e) L /* Convert 3-dB frequency */
. g* o' B3 M; n# Q W filtfilt(save_buffer, usable_left_filtfilt);
8 R2 p1 Q6 e- e- |3 n for (ixstart = 0; ixstart < 81000; ixstart++) {, d7 g! z& X; [. p3 A; \& G
usable_left_filtfilt[ixstart] *= 2.0;6 I1 R9 o% X# ]( A6 c; A4 a7 ?) ]
}; Z# `, k) ^& n: K% ]% V- G+ `; W2 }
( s- i% Q$ s4 J5 D3 M0 ^+ J: R" g
/* 注意乘2,处理幅度 */
. Z' Q; G' P6 s2 [! n; K /* %% 我发现带通之后其实就均值为0了,不用这一步了 */
6 {2 Z/ o- r8 a1 B /* %% 行列转换 */4 @% G( r( u- M7 w5 W
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
/ |6 \5 _ o/ J; Y; f+ g) B for (ixstart = 0; ixstart < 81000; ixstart++) {0 c5 @6 P, [, e5 M% t4 ^. `
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]: a- q) w% f: _ A& A. i
- yiDuanShuJu_mean;
z8 x7 j( \8 c/ l$ _ `; v( U }
! ]! Y* j" {- f* G5 v& q+ j- y1 g
/* %% 应该对数据归一化,但是这一步放在哪比较好 */5 Y U6 A6 h$ j
ixstart = 1;; J" r1 s" b( ^* L! ~$ D% P6 `' j8 u/ u
mtmp = youXiaoShuJu_QuZhiLiu[0];
l$ \2 W" H7 G# ?/ C0 N if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
) T. ^/ R+ H0 G! ]9 J2 v ix = 2;
F$ ]$ T3 X' M; c2 Z exitg2 = false;* p! d8 C0 y" q8 i. t, t/ x- c
while ((!exitg2) && (ix < 81001)) {
" Z; P. F$ ?* E' ^. b, \# ~ ixstart = ix;1 B& |: \: C M- w2 r$ s
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
3 e c3 J& \: O mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
0 T) f: u3 N; q3 \ exitg2 = true;* g( Q: W8 o* M" I- A
} else {0 o: X s3 ^+ u" W/ i. R( v
ix++;: q% n. K, [5 Q$ w3 r
}9 T* B; S0 y( _) s5 Q% q
}
! H% p& U& D y+ E1 i; v/ b! N }
9 o/ C" a$ |7 j+ ?
7 E! p: e- M1 [ if (ixstart < 81000) {5 A- a2 e! Z$ F# d
while (ixstart + 1 < 81001) {* L/ |. s; s% I, J! e
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
, G2 Q/ m- l4 }% e+ ~. c mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
" R( ^/ b6 K+ o6 s6 \1 E% s6 ^7 k }( f* ~" t- {0 T- d/ X/ B: [
! m' |2 s6 {. J3 h7 z; |6 c ixstart++;
; T$ ?3 a- f2 _7 z }1 h; J7 ]4 k p$ Z: G' e/ r
}
6 ^5 _! [! H9 B0 N6 t7 N% o( i' |& y% v1 L0 Z8 X6 k
ixstart = 1;
! Z0 G' m& e" g- M yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];( T% s; h- ?) u; D
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {# | u+ V% H1 s I; [9 F
ix = 2;7 x- T) _+ v# h" N3 _$ }
exitg1 = false;
- m: `( c) B0 V( r: ` while ((!exitg1) && (ix < 81001)) {
" ~7 z Y" [1 F) l( H' D ixstart = ix;" P7 M2 d s/ C
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
* ?" l* E; R% k6 E7 x R# J: E% T% | yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];, L8 G) C* }. L0 z1 C# j% F
exitg1 = true;
* B. N/ ^( k4 Z: t P } else {
8 o8 s- n$ {/ E7 B; Y ix++;3 u9 {) N0 C3 i& x! C
}8 s7 q/ p5 r7 b) Z! b
}$ D5 J/ q! x* @3 a" t+ p* K! `
}
2 z9 g: p2 [0 X0 X. K3 G5 l' D3 X; s5 }# g
if (ixstart < 81000) {) C% L! H8 o7 |) I4 V! d1 c; y
while (ixstart + 1 < 81001) {
# y$ L7 p% k7 p, O5 \ if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
# t1 R8 u+ X4 T( s# Q1 w! Y0 B* c yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];# S7 H3 I# T, g7 O- j0 }1 k" h
}
! N% a$ d+ Y. a# g
/ G: \: F0 c0 T- |' ^1 D ixstart++;
' W$ D7 R0 {6 S' k) q }
, w" j+ Q; _$ k# T* R }
& w. M2 c' m0 ^; x1 O2 e! L' s3 d$ w- L9 z
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);4 H% e5 E# R( b% v/ o
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
) l T- B, v7 ?- S yiDuanShuJu_mean = mtmp;
9 N) e# `; M# N5 s- B: ~4 K }
: o1 e W( \/ J- e, ]% b% H; z8 q3 I9 M) ^
/* 找出极值 */% L! g9 y- K! p
for (ixstart = 0; ixstart < 81000; ixstart++) {$ [* A; w2 @6 A
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;9 _4 P% I. P4 F3 N: F% V, B
}+ ^# z+ X; [; b* h; N* r% [
0 g! h7 N9 g: S7 Y% n% j --------------帖子字数限制------------------$ R' Q1 S% b& o' A6 e
}
# X5 W2 u, a+ z! b
0 @* J. _9 A2 a: s) v, q/ H6 u& z9 R
6 {' D* }3 O# j2 [. i5 F; j- R |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|