|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 % ^/ s! G9 T: B0 A" L* ?
p. O2 M1 g# F8 H# \$ }
各位大神:) c$ Z2 S; s1 y* @' Q N3 O7 Z2 r
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
0 _$ @ e" R, y" V( H 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:: o" e1 ]$ H- c+ D; N# @: V( `' W
2 i1 G* t0 R4 \/ ?7 ~( z% |! v
, u" o: b1 H# W# @5 o' `4 Z: A这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
% f" Q: u% r9 l. G
# B5 o8 {# k; d! t0 E0 {- M并没有其他线程
, N% |" l! d, @, V) s反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
7 V4 T: O6 ]) J5 U. P9 P0 U6 z也说不定是和堆栈有关系。。。。。。6 {, J+ J; D4 C! j
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....7 O, u; Y( m( Q8 E/ C
1 ~ h& n4 B5 p% ^% h; B4 G
! F( `' v7 I& c {; {& |
( ]7 J( C; Y( x我也很绝望啊,希望大神能帮帮忙,感激不尽,!
" x! H% t* t9 }6 h6 u- O [. G q; N- t# }& o
& p% h- ~0 w& M( Z
附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
7 ?. u I% j! ~ static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。$ k. R; }, h( E
P) s5 T8 [( J# N! eboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
/ F/ W1 w; G& K const double data1000[1000]) {
4 x$ _$ @3 h6 T+ ^, I1 E$ c2 D! n# [9 j
int myfuck;1 ~/ Y( S, p5 o, x: `
double yiDuanShuJu_mean;3 S0 j' J. B7 R2 J
double yiDuanShuJu_LowMean[1000];
]6 F- D3 F* {, m3 B/ c int ixstart;* O8 {" U6 d9 Y/ O7 f& P* e
double dv0[1000];
# ^7 _0 L1 B$ r! C comm_AGC pAGC;
9 n/ h: _3 t2 } B$ ~8 J$ c comm_CarrierSynchronizer pFineFreqCompensator;
, z3 Q1 [& ?. g; g) O2 L# Q dspcodegen_FIRDecimator pRxFilter;
; s3 i3 f% j* E: Z( [! n Y+ j; P comm_SymbolSynchronizer pTimingRec;, S$ \. t, m4 \0 R$ v+ ~
comm_PreambleDetector pPrbDet;
8 `: s# ^; D& m, |) F* s7 ~# s' m FrameSynchronizer pFrameSync;. O+ J4 x' n6 d% k! J+ J! a8 U
QPSKDataDecoder pDataDecod;6 _) A: t7 K7 E) ^& J% B0 U
static double usable_left_filtfilt[81000];3 t4 ^. P7 Y6 Y1 i$ e, K
static double youXiaoShuJu_QuZhiLiu[81000];
9 v+ H) E$ [- F( D( o double mtmp;
4 W: D0 P8 L3 L2 j/ ^. \# t3 w int ix;
! b( x! ]! j9 M+ J boolean_T exitg2; W4 `2 P% I9 d
boolean_T exitg1;$ I( b( }( m6 W. n& I6 u
double YiZhenShuJu[800];: E/ \* w0 H# w. D6 b
double dv1[800];
; r) y# l6 p1 F5 @* c+ U; @/ I, n4 B
7 o6 @% D! f' `2 `
( V& p5 w4 r: E+ L% E0 ^0 I9 I2 C9 c double b_YiZhenShuJu[800];2 Y! |: k3 }* z8 l- T% K: O) F
double I_filtfilt[800];9 L! _. Z! x* A9 \: }$ k4 u
double Q_filtfilt[800];8 T2 Y2 D7 k$ n
creal_T b_I_filtfilt[800];
% M/ S* `" _' ?, z; V# p0 q% W creal_T b[800];
' u+ d7 R& O0 a creal_T RCRxSignal[50];: H0 c. H4 _" J
creal_T fineCompSignal[50];
6 r- \0 S: Z6 A# I4 B# n double phError[50];* c3 o" W( D0 F4 D
creal_T timingRecSignal_data[28];# B3 g' t0 G5 R ]+ S/ Z0 H) r) i
int timingRecSignal_size[1];4 S0 `1 F3 u& _9 r
double prbIdx_data[28];, S* S' y) o7 p% \7 A+ z9 w! G8 K
int prbIdx_size[1];; [7 B# y! h. g2 R
double dtMt_data[28];: B1 r" u, ~+ k# N1 }
int dtMt_size[1];9 f6 O8 n5 ~1 X% J3 f1 D% ^; w
creal_T symFrame[25];
' r2 t, B# O2 V) }9 m8 f8 N; F5 x) S2 } boolean_T isFrameValid;6 t7 ]( X% J/ y+ R& y
double unusedU0[3];
* y2 C5 W& E$ P4 N& j- U U" H& G5 R8 K( ]
//调试过程中的变量. Q2 Y. f; B: U9 t
int enough_data;- G) @/ N. I0 e2 F8 f
, f9 d$ U& H. j+ \# ~+ t int enoughDataFlag;
/ v; _& v3 p2 j1 Z" \ int yiDuanShuJu_mean_int;
4 ^' p1 J3 U( t' p9 n int int_sum_dv0;. D. c2 b6 \8 u% x
int oo;1 E6 g# t$ F- S( e5 m# `- |
int ii;
' T2 m# y+ F/ |4 R, @# {" A! J Z myfuck=10;
- o+ h6 I( `! T+ p( }5 c- E /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
6 g2 K0 u) \% ^0 p /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */) i* p# u0 B1 b5 M) V5 q
2 ~9 J4 y0 \0 P* \/ y7 C
yiDuanShuJu_mean = mean(data1000);
* m/ w+ R! e( F7 ^& @" b0 r6 U
! i* g, |2 \8 I$ C7 m! q' i, p yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
' I7 j# C( j \( h UARTPutc('A');7 z3 D' A; p3 d, ?& Z
UARTPutNum(yiDuanShuJu_mean_int);
% }. E. {2 t9 M3 Y UARTPutc('\r');. m, i( F, V, Z$ J! I
UARTPutc('\n');; `* b8 j3 ^7 K1 D. j8 [- M
+ ?7 P* N: g6 g; c; z2 i4 G2 n
for (ixstart = 0; ixstart < 1000; ixstart++) {
5 d! z2 J: }6 w) E: u yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;4 O" h7 I: f5 T5 }; H
}* q( B$ ^. w& W% p8 _% J
o# i6 v4 `* c. i- W# P7 F power(yiDuanShuJu_LowMean, dv0);
3 u! A( i9 V! v
& B( g& x0 @5 y- l) t int_sum_dv0 = (int) sum(dv0);
6 I' Y9 `3 f& T0 h, f6 ?# Z2 r
UARTPutc('B');- y4 m4 S1 ?3 g$ |) W: o
UARTPutNum(int_sum_dv0);
+ q. Y0 t( r& h- M5 K UARTPutc('\r');* x/ [* c. u: g q
UARTPutc('\n');( Y$ ~, p) ~2 G
) e; h1 X. j$ v/ d
// int compareFlag = int_sum_dv0 > 1.0E+8;
7 B* Q) o" k3 `5 v. Y+ v W6 \# m9 [" H1 }
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?# t3 B: T& T5 r+ S2 r6 G4 J8 H
UARTPutc('C');
" e Q0 ~6 y1 k! F5 J+ J5 i /* 比较信号能量 */: A: b2 n W( b, J1 s5 j
/* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */* v ]' U0 a* Y' {4 U
// yiDuanShuJu_mean = 1000.0 * youxiao_k;
, r: v- k& F# G( g7 |// for (ixstart = 0; ixstart < 1000; ixstart++) {7 Q. E4 p. a5 K1 ?9 Y0 K& D
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =; a6 s, v% m; v4 i
// yiDuanShuJu_LowMean[ixstart];6 s) {' A! ]7 S0 Q' Q5 v
// }
: ~) {. j$ E, J0 e! E//. ?6 r1 q5 V4 ?' q) F$ Z; `
// youxiao_k++;' i7 c( y9 g% T5 {. H
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
: Q$ j% V, V: C// /* 感觉要取21个数,即0-20, */
" J/ G7 N' I/ Z! o$ [// enough_data = 10;//有效是10,无效是0% f6 M! j+ O% p; p& T/ R. r6 ^2 {
// }
! o* g3 ?' ]( J. Q; Z }
7 n, a; ~: h! X2 U
" B7 G' ~6 U. Q* s2 y2 N; j1 H, ?
* o F8 k( Y. K; x- n7 }4 A enoughDataFlag = 100;" r; f6 Q; j! N: p) n
enoughDataFlag = 1000;
. e4 F% e! Z9 @! j- `8 {$ ` enoughDataFlag = 0x02;
8 B9 ]3 Q0 b% G# \* j' q enoughDataFlag = 200;1 Z/ h8 H, w7 i; \. Y1 l* g
- T, i& ^2 z7 {. k- W; a8 o int myfuvk1;; }1 ?5 }0 @3 K% s. p
myfuvk1 =11;2 P& Z' e. ^- Y& e7 A
* H3 A; E( L0 {7 t# u7 _! N' @2 p: Z
, E0 m9 C: F0 ?" T
enough_data = 0;1 Z1 L8 V$ ~: `! \% P, s7 w
( y( U* K1 }/ B+ X// if(enough_data>50){
8 H2 Y- x' V5 |* {5 V3 ?// enoughDataFlag=0x01;
( C3 k1 Q0 N: F8 d* l// }else if(enough_data<50){- w- h# J/ R# _& r9 A! ?0 b% l
// enoughDataFlag=0x00;//0x00还是不行
4 a! u. k; _+ \# v6 s, x. L// }
; y: B- m0 D' F) C
. Q, F0 M* a8 y8 @& B& d/ J+ q+ l! K8 o
oo=10;
: }3 Q3 J5 }' m/ g! e* g oo = oo < 5;; [ \; Y- l- c5 [% G1 n
if(oo){
; z0 P" ~( F/ D" p" `) k' n ii=0;: l) e3 s# k1 i
}
7 m, z8 z0 D! y/ q2 `& f8 T if(oo < 5){3 Q9 s& N1 b6 i; K. }
ii=0;
( g0 q/ v* l' m; ~$ |( M: T# D }
% U5 ~: R0 f' O1 I- L if(oo > 5){
0 p) z4 f8 R1 G( {. D9 d ii=0;
' j0 L5 F5 O% o6 c6 }. I/ z5 Z }! J7 }# \3 w; p% u" ~0 O" m
6 a$ U* |% r, i) U+ W7 k, j
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
, @! z7 K# |9 ~; b7 W. D /* 如果数据足够才执行主程序 */: G* `: K( _. O( D0 J: t) B. j* L
oo = oo < 5;
9 b3 y9 W6 T8 e" B1 H) ~+ W3 M enoughDataFlag = enoughDataFlag < 5;1 y6 X+ [* M0 }- Z n- ]# A# `2 N
if (enoughDataFlag < 5) {
$ T( I* I' n" b+ l2 a( _// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
* [, o) w+ ]; d2 w8 Q* M, j9 t AGC_AGC(&pAGC);
8 k2 n# u1 J" L9 Z: ]4 V5 n, o5 P- B3 x) [
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);7 @7 [3 O2 [1 z. \7 L+ k" h
FIRDecimator_FIRDecimator(&pRxFilter);1 U/ W1 }+ P7 ^
: o# N8 x( \9 i) y. t" x1 }2 Y Q /* Downsampling */' w+ q# b c0 V/ s8 {3 w- m N
c_SymbolSynchronizer_SymbolSync(&pTimingRec);0 a- y- d9 X7 X0 w4 `
4 _' `) }3 r- H! j' ?
c_PreambleDetector_PreambleDete(&pPrbDet);
5 Q. M' @& ~' K1 }
4 w2 s1 W- O5 u. h2 Q /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
4 a2 _ D/ q% C. z$ F9 }( Q /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */6 n' _/ R+ W: t6 Z: w0 j
/* %帧数量=100 */( q% I9 h( |3 I: U& k- a4 b5 _
pFrameSync.isInitialized = 0;
) b0 U6 r Q/ b4 Y7 [1 R: p+ V
1 p; s ~$ [7 v( d8 d) | /* [EOF] */
. w3 _, u# Z& o: v, _ /* 前导码长度是13 */
7 ^, R" j4 `! m6 X. G8 Z* [- s /* %qpsk */
* Z3 b* W0 j9 z8 z5 ?0 L pDataDecod.isInitialized = 0;
7 e' t- z0 |4 [4 Y9 S
) E& T) u$ n3 w t* C4 X! V /* end */
, K, a' v: A- H, Z7 `6 a9 R& \7 Y. N /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
; C" F8 M" d2 X7 ~' P% E /* Convert 3-dB frequency */
" s1 N, S z# S' |% R# i- Y- b /* Convert 3-dB frequency */
# ^* j2 r5 V! I) _; t0 i filtfilt(save_buffer, usable_left_filtfilt);
n+ |. b; ]8 |; h) K# t) n for (ixstart = 0; ixstart < 81000; ixstart++) {" O6 D T% G7 R; r: q
usable_left_filtfilt[ixstart] *= 2.0;
3 W g! Z$ t% ~ X) q T }
& h( L e) b# |+ {; H% d1 I, B2 d' J$ Z. k; k4 m' t' a/ I
/* 注意乘2,处理幅度 */! t+ g& y: w' I" [
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */5 ~+ b5 ]# |: \; D `* z% N: j
/* %% 行列转换 */% }( e* }. P- F6 u- I
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);
2 _3 H; m9 R# l: P o; O for (ixstart = 0; ixstart < 81000; ixstart++) {- {0 c7 Q) D7 b
youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
9 n( t7 m) O8 a* ?% S1 W1 F% U% ^+ N - yiDuanShuJu_mean;+ x# C4 Z& v2 h5 s
}# n3 b1 y( ^* @2 b- q
7 ?. R& u5 ~- C& F9 V
/* %% 应该对数据归一化,但是这一步放在哪比较好 */% j# r/ @ d& \* g' k
ixstart = 1;
! J! }: h& g; A' \ mtmp = youXiaoShuJu_QuZhiLiu[0];% _2 Q$ n& j/ K( f# X0 j
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {. w6 u, y' U7 r! m. C: T4 n# A
ix = 2;
- A! K/ s: ]7 m7 `/ @) D; b( `7 j exitg2 = false;
& o7 S- Y3 G4 z) K3 ] a while ((!exitg2) && (ix < 81001)) {& x. `3 Y1 K1 m7 w i$ p
ixstart = ix;: W1 R3 i9 K' a7 q G2 ^+ @9 Y% V
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
3 S/ d Q" V0 t+ Z2 ` mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
7 v0 S: A; `7 k& D exitg2 = true;" g' {; j* }; i8 D$ d
} else {* t6 }* {+ o& k& O6 s+ ^
ix++;
2 N1 h) c% X- m. W3 ^7 q } r0 y) c1 F' p# \+ F. r$ O
}3 D% ] q: P4 {# F. O3 l7 i
}$ p% d. c* E1 v1 u
* Y, e3 p+ h9 g5 T( c+ A7 G, \ if (ixstart < 81000) {* `+ e+ ?& U% g3 w# K5 K* ^
while (ixstart + 1 < 81001) { @4 ~' D" N4 D, l) ]$ X1 z( c% K
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
% m( Q3 ?2 M' ~5 s( k9 i mtmp = youXiaoShuJu_QuZhiLiu[ixstart];# w: u; a, t+ v6 w* Y; V) j
}$ x; E# m* S( c3 J2 M1 f/ f
: @ k1 ^ q7 b) ]4 L ixstart++;7 a& ^( F" ]3 o* _% G9 @
}) a- @. s2 A* `( T
}
6 z3 \ {/ g' r: F! e- k1 e0 `4 H
: T1 ]0 ?. F0 _; D+ W3 T% D& g' A ixstart = 1;
4 q* ~4 P R' K0 r. b yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];+ G$ p* L' z% b5 G* k% K d
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
; \9 y* _+ x( E- [& z8 m2 F5 l ix = 2;7 L. W9 q& t1 S" C
exitg1 = false;! H* X* J/ e- @& Q9 e5 K. `: F
while ((!exitg1) && (ix < 81001)) {
5 i. i5 G! z4 r7 v3 ^1 f ixstart = ix;
7 c: |, h8 g8 c6 P3 @0 [% u5 k if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {6 |0 W5 r; ?& U. Z' ^% ?- A* D1 C8 `
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
8 t8 z+ S2 T: S exitg1 = true;
" z3 T. M" ~7 ~2 y7 |% r: w/ { } else {
3 V/ s( }: O$ M ix++;! z* K# x) w* ^2 \& p% L7 E0 W; a
}
, T9 s/ }4 Z3 r/ d b1 u }+ z; \' r* C: Z! d+ |( U. Z) S3 z
}7 c; L) x' W/ ^
! d% J, J2 }% X+ {
if (ixstart < 81000) {' R& y9 M# h% F/ n
while (ixstart + 1 < 81001) {( T# d5 V; {9 V( B, D5 y% [
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {0 N; z9 B+ ?0 b" L; m
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];" j w& `( V$ K) l3 C- }7 \
}
* O+ k( S: r# L# B; e* z0 p- y' u, [
ixstart++;. k4 @0 j. g2 N
}
0 U( ]4 C4 m0 k3 p% x }: P- c9 n9 T' A8 T6 `
; ^- X$ i5 y! Z! b" }: u% C
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
" ]; U# }9 [8 ?" u5 R if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
6 j5 y9 s, Q9 T8 b9 s( ]( C/ H" o yiDuanShuJu_mean = mtmp;
3 B; _4 Z" k; ^ }. L- d2 [' W6 b& E3 W! y; M' f" e
& X4 V0 a4 n) q( d( v5 c /* 找出极值 */: z7 J- a( B8 L7 n; G
for (ixstart = 0; ixstart < 81000; ixstart++) {
# F2 v1 b$ u, l youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
/ `) \$ \) n( I: R }: J" r- p/ o) Z! I7 v8 r v b
: p) v8 B6 [0 U9 U --------------帖子字数限制------------------$ _3 {% u7 E$ S# x9 g7 `
} z- u. _ C* T- @7 f3 [
3 ]9 S3 J' J5 ?) P/ B
3 c8 Z9 Z5 v7 ]1 @7 |( {
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|