|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
: w, i! g! a' c; ^" P, a3 Q6 V0 N; g; z3 t, _3 ~# j% f
各位大神:4 o3 p5 w; |% p( K- ?
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
2 p, F. V* T7 V& p: T: g: W& R 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
z. E$ x" n! l& ~. d9 O/ w% g$ Q4 U9 r v
! v/ R( E& Z! q0 h这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。" C0 G, |' ^1 L! O/ G7 y: A
" ]% F* C- ~$ B; S9 p/ \. v并没有其他线程
, \3 B9 f! {3 T9 H1 U% Z反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。* ] U5 f7 @" J- r% ]" N' H
也说不定是和堆栈有关系。。。。。。7 Q" }' U% N8 b" ^& @8 d
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
* A ^1 ]8 x- w, W* T4 _; a* e4 p2 u3 o# ?) p3 h. Z
& N4 U& j5 Y4 \- F4 ~4 A0 J/ S T, s# `9 `, Q: ~
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
8 d' B& r/ @, |8 C" `4 @- B3 e. f4 X8 d: U9 E' J% I; \
) P W1 G/ H6 i; ]附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];
' O- i7 [0 a3 S# d static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
u* o! [( N0 I) ^0 R# V9 X% a7 X3 J* P$ c% l' ^; q* O
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(9 G( u1 t8 T* x# O \4 a
const double data1000[1000]) {. k$ T/ Z z9 f* x: d) l
: y* A) Y3 g$ |; j: S
int myfuck;
8 ^& C8 k2 m# Z1 I( } double yiDuanShuJu_mean;. X% C. m: `* a* }2 k2 Q6 E5 S( w U' W% _
double yiDuanShuJu_LowMean[1000];9 r4 L3 {) G) F m2 H
int ixstart;/ s) i& H! K4 U# r
double dv0[1000];
( x2 j% {9 W+ S6 I# c9 @ comm_AGC pAGC; k- W* I% J" a" R5 t/ {
comm_CarrierSynchronizer pFineFreqCompensator;
* [4 R5 ~2 k6 ^5 t, m dspcodegen_FIRDecimator pRxFilter;/ `" X$ X: Y- [. j( m' h- y
comm_SymbolSynchronizer pTimingRec;: c, X1 H7 j' [/ x. `
comm_PreambleDetector pPrbDet;/ Z3 Y# r9 m1 k' _) I. `5 t
FrameSynchronizer pFrameSync;5 i4 o+ C% {# t. u" ]2 ~
QPSKDataDecoder pDataDecod;% a H' `) E3 {# f6 A, T& h) p
static double usable_left_filtfilt[81000];& x! ^% o/ _5 Y- e+ ?
static double youXiaoShuJu_QuZhiLiu[81000];
0 C! B4 h5 j) j: B double mtmp;% \: h6 k; m# F" E$ z5 s% o
int ix;, h/ Z# `! S1 G- o8 \5 X
boolean_T exitg2;
8 x( P9 Z4 S0 I0 p3 L" K* E boolean_T exitg1;
; [' F5 g G v double YiZhenShuJu[800]; b" \% L3 z& l+ {+ y+ f* y. c( u
double dv1[800];; a$ u- g, r3 B) r
/ L; f L0 x) r( L- E6 P
1 e+ V/ z& r( {% w {+ E& C) c double b_YiZhenShuJu[800];* ^7 U! i0 S" t3 H
double I_filtfilt[800];
' |9 r) B P: N: u; E double Q_filtfilt[800];
) C) P) T, l$ V1 v/ t creal_T b_I_filtfilt[800];6 p' D3 {( w: @) G3 F
creal_T b[800];5 ]9 U9 Y5 k, s7 B
creal_T RCRxSignal[50];
( f- Z/ I7 E$ `' T2 X) K creal_T fineCompSignal[50];
' k! k$ Z0 F9 T( {) e double phError[50];+ u3 q) X" t, w
creal_T timingRecSignal_data[28];" C9 l: ~) [& A5 K) s/ q
int timingRecSignal_size[1];+ h" _& a9 V% d( V; X! w3 P
double prbIdx_data[28];
7 j8 a' X" y t6 J9 c8 R int prbIdx_size[1];* }' p$ L$ Z& d# E$ p
double dtMt_data[28];/ K3 _1 h0 m. c% G) }% p$ x
int dtMt_size[1];4 j! B9 B5 O: N7 }0 N- @
creal_T symFrame[25];
- d7 y+ o7 D6 j6 D/ m5 q2 d8 I# D boolean_T isFrameValid;2 v% ^* O3 z3 k6 J
double unusedU0[3];
5 b1 Q4 u8 b, G2 u3 Q4 G! h, `) j. _- g2 _# {) J& D
//调试过程中的变量" ?0 ~& T8 f) X, }3 L" @" c9 X
int enough_data;6 y" i" @ l# K1 W3 Z
$ \3 R9 T! z; ~8 r& k- C
int enoughDataFlag;
; ?( n/ @! U; e1 Q! I: t- ^: F int yiDuanShuJu_mean_int;
3 _! V" l4 j- P" l' |5 N& l# v int int_sum_dv0;
' @% I1 |3 V, I* w+ M int oo;+ w( O& P$ o4 H& ~. w5 \- k8 l
int ii;
0 `3 D! r2 C+ W$ h8 y- V/ x myfuck=10;8 \+ B$ K& l" ?5 k. G. s/ R
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */& K# w$ |* l1 S/ a, w& `
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */) s2 n6 m, V" j
4 k8 B$ N/ F v/ A7 h& F) U& I2 N
yiDuanShuJu_mean = mean(data1000);
: Z) k1 E5 T8 Q7 @8 `: _9 `% |# R7 ^+ @( h7 v2 U0 Z! o) c
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;: m5 ?8 O# z! P$ F
UARTPutc('A');
" |# ^/ s* V$ @/ i7 d UARTPutNum(yiDuanShuJu_mean_int);
- s& X0 P: b @, e% k2 H" i UARTPutc('\r');4 ?( A" U; ]: W( q
UARTPutc('\n');
1 }2 a6 G" L. \ t' ?$ A, r1 g. J( {; n9 b9 \: L+ i
for (ixstart = 0; ixstart < 1000; ixstart++) {
: b! T! B7 Y% Y' b) u yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
' E9 u1 s5 z1 M6 L- c }+ a, m2 I. N% W0 M0 u0 O
! n% T! L2 |' h3 P7 V5 s
power(yiDuanShuJu_LowMean, dv0);% i+ Q8 r/ d2 A" x$ E' {
}# ?3 ~/ a& G% X# A1 g; S int_sum_dv0 = (int) sum(dv0);
4 {$ ], K. T( P: _1 J# ?# q
2 R$ ], h: H1 Z UARTPutc('B');1 d' j- Q: M/ G' w/ P7 G0 k
UARTPutNum(int_sum_dv0);# ]& X5 e8 i0 i# o* }. z% ^
UARTPutc('\r');6 k- F' H% N: l
UARTPutc('\n');
# T# f3 N' j6 V" r
# f' h) T" h J- w+ A" T( k// int compareFlag = int_sum_dv0 > 1.0E+8;
3 g- f0 t- h$ W0 K7 r Z% ^$ C" T% X7 k4 Y" i/ h
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?8 V3 n4 N* P; m. u* _, b$ a
UARTPutc('C');8 R% ]( z* e1 M9 a% g4 I
/* 比较信号能量 */
! f+ [: Y& f$ s5 @- M5 J0 C# ? /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
4 d6 J: a t2 x7 `$ M! ^; Q// yiDuanShuJu_mean = 1000.0 * youxiao_k;" o2 K; L" @ x9 j; q4 W+ x% T
// for (ixstart = 0; ixstart < 1000; ixstart++) {
8 Z' l# |* ~+ A6 Y// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =4 r/ p- E! H9 s1 q5 S
// yiDuanShuJu_LowMean[ixstart];
9 c+ K" ^& _8 V; q* T// }
$ W5 r2 b1 K/ z0 T; T/ r3 d//7 h9 Z8 o% c/ \ E" n' j( z; P
// youxiao_k++;
* T$ h5 d' T# \/ v/ K1 J; J// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==
5 ?' ^/ c7 [% Y' R& g/ \: [// /* 感觉要取21个数,即0-20, */
4 e# q! r# k, Q. m) t% J// enough_data = 10;//有效是10,无效是0$ V, S* b2 X4 e2 x I: A! \
// }
$ f9 M. F( I" b( y2 z2 S* @7 X }; a+ ?- |* C6 p c. e. p2 B
# r" O% M/ @ {. s# Y8 w4 Y
; }3 P" A% F( ] enoughDataFlag = 100;
- \: u# G2 h2 }) z enoughDataFlag = 1000;
1 S5 C, R+ R2 N enoughDataFlag = 0x02;
; O" d! {' L+ E* a: y z enoughDataFlag = 200;
$ }& o! y6 o( u: ?+ k$ r1 c) b9 \6 T( S5 E
int myfuvk1;
3 n8 e" W4 o& k& I myfuvk1 =11;3 o+ s1 C; X, ^8 Y
9 T1 Q( h. ?# P0 |& H3 R4 }6 t O4 t8 a, U$ m
enough_data = 0;
" h1 {5 }; F0 P$ p: l; F. Y* A. A
// if(enough_data>50){# y. K) S/ s+ R( M" R" t
// enoughDataFlag=0x01;4 `/ a d' g+ @( c& l r
// }else if(enough_data<50){8 Z% r& N9 \0 k o, f, E" j+ S3 {
// enoughDataFlag=0x00;//0x00还是不行& ]0 D; v+ G# i9 e) q6 L F
// }( w, p: B7 t$ F" [( q# x
( W4 X- K: `( ~; z% ]
- D# G$ N7 K! g/ Y9 w7 @1 L. j$ ^ oo=10;+ o( u. \& t3 m% W- m: r# v1 C9 b
oo = oo < 5;- w& a! n- V9 L1 U1 f+ r3 G# Y
if(oo){5 a# @7 [3 `9 b
ii=0;
4 I6 _* I* Y" P }4 R+ {) _) l& |: v4 t# C6 A* Y
if(oo < 5){$ E0 i0 [8 q- t! m2 d7 p5 A% @
ii=0;
( N. O0 j8 f. l }) _/ U5 n/ y8 r' F6 y, b
if(oo > 5){
3 Q1 ^7 H! i: Q2 P; [5 ~ ii=0;) o$ F# N$ v1 l3 d$ q- \
}3 V5 t1 X t: O( l# m
1 z& b. S7 w- A$ `
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
) E, V- r1 d; Q" ~ /* 如果数据足够才执行主程序 */$ e: N2 {; J' Q& p# Z, V! u7 W
oo = oo < 5;
# Q) L9 U, d% [0 \# s) M enoughDataFlag = enoughDataFlag < 5;
9 p" C% L0 y1 n8 h4 f' l if (enoughDataFlag < 5) {
1 Q8 n) G2 j7 o$ O// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0$ A! e' O0 x7 ?1 p
AGC_AGC(&pAGC);/ h3 E& Q, f) H' V
2 s+ @6 d6 ]$ N' I' Z
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
, E# o0 m0 b! c2 @7 v( J0 M% y FIRDecimator_FIRDecimator(&pRxFilter);6 M1 n- D- B2 O, |! V' e }. K
1 N* c3 F0 c3 ^9 i /* Downsampling */0 e3 [8 l( N2 s9 P
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
# ~1 n7 p, l% w- d7 ~, J( ?
' r ^0 C! I7 D% w& i: F, [, ?0 j) O c_PreambleDetector_PreambleDete(&pPrbDet);
9 Z) ?6 P$ s' I7 T5 \: _7 {9 Q5 ~% E
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
" n: d. D! ?( H /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 ^$ [6 e3 Y9 v8 @. U m) k /* %帧数量=100 */ L$ Y& b; i* E8 _" A9 N
pFrameSync.isInitialized = 0;
7 f" X6 b- x) K4 o) [0 X& D. n6 ]; z0 P, B7 \+ k, ^
/* [EOF] */
, w% P$ c3 G1 M" U /* 前导码长度是13 */, N6 _/ j3 p4 v- G9 O; o9 F% s
/* %qpsk */- ~/ W* ]7 k4 d1 O
pDataDecod.isInitialized = 0;
' }( H" L9 C0 @- s+ s: \7 J
8 j* K T$ a# G/ E5 E1 r% } /* end */; P# N5 s B- u" A1 b; o3 n
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */. \: H. ~* j" B$ v$ b
/* Convert 3-dB frequency */
% J& ^9 k% w6 l /* Convert 3-dB frequency */. E1 l3 i: n8 v1 K, i0 I
filtfilt(save_buffer, usable_left_filtfilt);
0 U6 R9 v3 e, w- \( w; b# b for (ixstart = 0; ixstart < 81000; ixstart++) {
9 e+ N: {! d! d" [ K2 P usable_left_filtfilt[ixstart] *= 2.0;
7 {1 w, p0 z& @ }
. c, u9 |' _& k: X1 U- \
9 o6 D9 O, Q% h' Z' z /* 注意乘2,处理幅度 */7 `/ v! F# r6 e& R+ _2 E+ w8 l
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */ W2 Y- a2 z0 E* E
/* %% 行列转换 */
; F# C+ g S! n2 p( X yiDuanShuJu_mean = b_mean(usable_left_filtfilt);( N3 K9 w C7 _8 A8 p+ ~
for (ixstart = 0; ixstart < 81000; ixstart++) {
9 m R5 i1 `, w5 J8 u9 n youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
; x3 ^! z4 P1 R" g - yiDuanShuJu_mean;( u" F9 \6 e- x, C0 m! _( Q( B$ {
}9 W8 R+ ?9 z, a; b
- [! S I0 A' |, o
/* %% 应该对数据归一化,但是这一步放在哪比较好 */( A" g, ?1 R. I& S) U
ixstart = 1;
6 i+ I- `! A/ H0 |3 x D mtmp = youXiaoShuJu_QuZhiLiu[0];6 E" \. {9 |" I, z* v4 C; |7 d
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {; ~/ p4 z6 Q* M! k9 U
ix = 2;7 Y5 ^% w0 _7 P7 o: Y" Q
exitg2 = false;( U _9 _. I: n/ J* S O6 u
while ((!exitg2) && (ix < 81001)) {
2 i' Z9 ^ m' U% J ixstart = ix;; z# ^* e7 N' U( [; A
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
, g6 L+ g( _ x/ P, {: O mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];, S- I; O. F w) n8 f
exitg2 = true;2 }9 H6 L; M) |# N2 o$ D
} else {
: B* y; x4 o; l ix++;, b* N5 `7 l' [& ]8 T) Z- i1 h3 C: M! f
}
+ U/ _0 \. j; `; `5 Q9 g }
$ b r% q8 t( ?" y; I }
" S0 f. t: y1 P* }7 I* K
! Z1 [$ B+ R$ z% U) x if (ixstart < 81000) {
- ~# x) @/ u2 q- _6 y1 G T7 ~ while (ixstart + 1 < 81001) {$ J. K6 b7 ]4 f$ i1 f% J0 Z, Z; S+ L
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
+ A& `1 `, N j" P6 B& x mtmp = youXiaoShuJu_QuZhiLiu[ixstart];- u) l( X& P( N; S) a3 O, F
}6 [( Q- \$ f5 R6 K0 f0 F
7 n8 e9 I3 z7 Y3 X! {1 i% F$ I ixstart++;
6 D+ {% L8 _2 B' s }! x7 K/ v7 v7 B! z
}
4 R$ `* A O6 C3 A$ V; a* F9 u4 t- [! |
ixstart = 1;: o& A( w* e- }! N
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
* J: o# G! X. L" y% m5 n' e D if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
' A2 D' K8 Z1 G* p ix = 2;
" V7 t I5 l& b1 \' ^0 U exitg1 = false;
* |7 r# ]' K3 Z# r1 @& [8 X% W; i8 o while ((!exitg1) && (ix < 81001)) {
& C4 P1 Y# Z( a ixstart = ix;( |: ], ^6 @ M
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
9 G* L Q( j1 H, R% T' ? yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
4 r' `' Z( b6 n! s: T' Z exitg1 = true;( X0 P4 r) X: Q% w+ Q4 ]. v
} else {
6 g$ J4 X6 |, j ix++;
7 q" m! u' l9 i }% u. X/ W2 q# \5 q, m6 ]" O' \8 G
}
& d0 N" S/ Z/ K @ }
3 u) c; D# u2 Y9 G; f. q, a& b$ ?
if (ixstart < 81000) {5 J. g' Z6 p) l6 X+ b3 f1 H8 T
while (ixstart + 1 < 81001) {
/ i; l/ w' g1 t" G! S if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {; X+ C% c4 W' S4 [
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];! E9 k1 c& |& z% @$ }# e
}( S9 w2 }( U- Y% ?
* T) ]4 c3 m3 `5 E& A4 f, J ixstart++;
3 Q/ N% w# v6 X/ F* d9 ~. t( N$ d }
1 L& P% r# ]3 A' j. \; z }3 b9 L N' S8 _/ \
- ~# x4 G' ~5 F/ D5 ]* ?
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);/ t. y% q9 |% Z8 g, S1 w( t
if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
7 p+ C1 u( @& i* E1 k8 c yiDuanShuJu_mean = mtmp;
]# s) n; w6 T# ~9 X) h }
8 C; \' O1 L& }, W N% u8 D7 N& B4 t! r( g# z4 H
/* 找出极值 */
# f' V+ j& K. { o8 [ {% E7 B for (ixstart = 0; ixstart < 81000; ixstart++) {: |1 M, L6 R: e) D
youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
$ T2 _( W4 n" _6 S$ x }
3 n/ w8 U d# K8 E, `1 {
; ]1 l5 M* Q% y2 T" H% _; j% Q --------------帖子字数限制------------------' O3 O' b5 B6 m; _
}
5 V, p. L* T' D5 Z; s/ w) x1 ?
5 ?/ C1 Y; ^. M2 c4 a( \- n/ U
( ]0 ]' W9 c# n" ] |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|