|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
; B8 b! ~4 k9 M8 h6 V5 @
5 i4 i* T, T- C9 }各位大神:5 [( l; F% @$ k7 _$ C1 h7 I( {) F
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
7 n1 h) g3 o- _5 Z, @ 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
9 A" j' W+ z! Q/ y* m* h2 z+ u0 L2 w+ @/ y9 K( {
: p7 C2 [8 ~0 v0 Q1 O这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
3 T$ Q& U8 }; z2 p7 }4 F1 S$ {3 `3 z5 i. T0 G* K) ~% K
并没有其他线程
/ q9 r# F4 |0 ~" V+ P" R1 |反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。
( T; `+ n' \4 c7 j! t也说不定是和堆栈有关系。。。。。。# y4 _1 B, _2 V" g, }
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....' e) W% U8 @+ s
- B" R* {/ Z! G0 H7 T
. F' S8 E, q1 ^: C( Z- o* A; {* K! ^" b/ L
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
# |* O `; U$ t e2 }7 S! g! N3 G1 B; z
8 N9 d ^0 ?7 z- m附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];. W# I- K* l/ B5 x7 [
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。: T6 p6 ~% K0 B2 Y! X2 \2 G' Q
/ c- s6 X6 A! |boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
* O7 Y: q9 {3 M5 \; E" E5 `. | const double data1000[1000]) {
( r6 y# @1 c: c) h4 W
$ I5 T- f* w7 m int myfuck; O5 |3 k9 B D* e) l; X. e2 S
double yiDuanShuJu_mean;
' F5 C' }/ \3 s( w/ _1 d7 k" q double yiDuanShuJu_LowMean[1000];0 I; u7 H2 r0 w8 z0 I) d5 N: r
int ixstart;
) o V4 F% s: `6 v double dv0[1000];" m$ w) a ~8 ?# h7 h: P' \6 {# F
comm_AGC pAGC;) p& z. }' }; Z: h' \
comm_CarrierSynchronizer pFineFreqCompensator;4 U, E4 j. g. d" r" e1 `
dspcodegen_FIRDecimator pRxFilter;' Y$ S; l+ m6 L" i$ P
comm_SymbolSynchronizer pTimingRec;
: z1 h1 e+ {( t# P6 l comm_PreambleDetector pPrbDet;* r+ z. g$ d0 S6 C- v6 g
FrameSynchronizer pFrameSync;# n6 H9 s0 t. C! E
QPSKDataDecoder pDataDecod;) F8 }/ l# _5 x$ e; J N/ ?
static double usable_left_filtfilt[81000];$ t6 R7 h, ]6 H" T1 R: w4 X, z6 I
static double youXiaoShuJu_QuZhiLiu[81000];
1 [, j+ ~; {6 h: G5 ~- r double mtmp;
/ x" t8 L; P Y+ y7 v int ix;4 ^! i& X, L; @* G* B+ L$ B* U, \
boolean_T exitg2;
& k1 n2 s4 U. S. T, B! d7 f3 I- d boolean_T exitg1; Y x6 d9 G& R$ v
double YiZhenShuJu[800];
5 @- C. f, Y2 o* l4 F* P double dv1[800];
) p" l" R' O' u8 Y6 N3 Y
, K [8 ^; o) N4 v7 F
3 L4 B3 z: b7 P' K* ? I0 x) g double b_YiZhenShuJu[800];2 p q* ~, s, v; d( x
double I_filtfilt[800];( T. H& b1 O. Q7 F
double Q_filtfilt[800];
* a4 X9 U3 X0 N/ p( f$ i- E) q creal_T b_I_filtfilt[800];
" E9 |- c0 r5 _# N creal_T b[800];+ t- P! M0 ?3 ~) E9 }& h
creal_T RCRxSignal[50];2 c' ?: v* h6 B2 Y3 L" G
creal_T fineCompSignal[50];; U; Y- s w, J5 q/ Y
double phError[50];. [$ N" ]! i1 D; w) ~' Z% J- J
creal_T timingRecSignal_data[28];7 t) o" j \/ X
int timingRecSignal_size[1];
% t2 o. ^" V' R& _5 Q ~% D% q2 O double prbIdx_data[28];0 e( v. |/ h& h+ k$ J" V% _
int prbIdx_size[1];4 y# i5 ]) r8 k
double dtMt_data[28];
5 }6 W$ S$ m& u1 k int dtMt_size[1];
3 u4 x- O% T4 @( l( A creal_T symFrame[25];; I( d( C0 H% u. q( s* F
boolean_T isFrameValid;
' W, T% F" E7 S9 ` double unusedU0[3];% ?7 |6 y$ J; s( t$ }6 n
. @ F, l9 L' g6 J //调试过程中的变量# h0 @: \. r1 B* M8 w# P3 f& K9 L
int enough_data;5 [1 Q8 k& X/ | a
; A5 r7 ]- }% p4 _4 l
int enoughDataFlag;
; E( h% r$ W0 l- {, p int yiDuanShuJu_mean_int;' l8 c2 E5 l ]7 c+ y
int int_sum_dv0;
' [ P* @3 @/ M' B int oo;! Y" }; e. Q8 {) [" z2 c: g
int ii;8 |3 D6 h0 d- ~# X, N c& U P8 l
myfuck=10;
* J, u$ O3 z! P* g& I* ^1 n5 }; @ /* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
/ l ~/ O, G# P9 F$ a2 u4 @0 Q+ L /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
9 V+ Q4 L# R7 u+ b8 { B
& Z" |3 R3 @$ o% Q2 [; H/ p yiDuanShuJu_mean = mean(data1000);4 w/ A: ~# G0 ^3 M5 {! f( I; \
; t- U+ A7 [8 N* G yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;+ `% S+ z) u8 {
UARTPutc('A');
7 r }" T0 C& s1 \ UARTPutNum(yiDuanShuJu_mean_int);1 `( D9 L3 p" F9 G1 Z
UARTPutc('\r');
[' J/ P9 ]. K# r l/ n! w UARTPutc('\n');
3 z" K' y+ H8 M- z7 o" c* {% {: k4 V3 t$ f% M# x1 {/ |* V
for (ixstart = 0; ixstart < 1000; ixstart++) {# f+ I- N6 O# |1 n' t4 p2 I
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
9 X/ @2 ?3 D9 f0 n7 r$ @3 l }
9 p+ f1 X5 i7 s8 e0 D% H
6 Z; @: z1 f& [4 ~+ Y2 E& K! D& V power(yiDuanShuJu_LowMean, dv0);
* U/ H1 L5 @# I, t
z6 B- k) B, m( D% v int_sum_dv0 = (int) sum(dv0);- U# W) J( {$ i/ b% c% l7 U) d
) S; S+ E* {9 Z3 i2 i3 B3 ?/ }& L! v UARTPutc('B');$ n6 V b. F/ j
UARTPutNum(int_sum_dv0);
8 M1 s ]' [" Q( D UARTPutc('\r');+ A3 n* i+ \; t0 K0 M
UARTPutc('\n');
9 R' M+ R9 P5 {, A; n/ R i
- [. l( c% m4 m# p/ D// int compareFlag = int_sum_dv0 > 1.0E+8;/ D5 }+ O/ L2 i9 H# l# C7 _# Z
3 X9 u$ r* [* @5 d( c% l
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?8 X# C$ h# \% Y6 P
UARTPutc('C');1 f$ [. e% Y* u X: x1 K' {; y- h
/* 比较信号能量 */
3 S" P- A$ q7 L5 O /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
6 e" C! E1 A! i( l6 P// yiDuanShuJu_mean = 1000.0 * youxiao_k;
& N1 |0 {! u- ^& c// for (ixstart = 0; ixstart < 1000; ixstart++) {3 f7 d" L* f# w3 f- S: e
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =
& y1 m" s. O4 B1 r// yiDuanShuJu_LowMean[ixstart];
1 [/ C9 b% D' [% e s/ M' C5 U* K/ A// }
/ v) h4 @ K. u: \, J6 y; `0 E//5 e- R- g8 j: I6 i2 Z8 }
// youxiao_k++;
, d7 b: b/ Q7 T8 f/ I3 [! o* Y// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==4 y3 P' ~- X! ^9 R) D9 y
// /* 感觉要取21个数,即0-20, */8 c8 Q. I7 d- B1 ?7 f
// enough_data = 10;//有效是10,无效是0
7 y) y1 V# b. h0 r( q, q9 }// }; k3 R8 u3 Y/ x. T: G8 |
}3 n5 s- q) Z" Q3 z
5 y4 ~# D+ Y2 ?5 ~$ A1 f: O! E0 x
/ H% F6 m+ N& |# ]
enoughDataFlag = 100;9 {# B f* U/ ?2 G8 D' ~
enoughDataFlag = 1000;$ T+ E- z5 y, z$ e" i- Z
enoughDataFlag = 0x02;
2 Q7 D: T- n" B. t9 ]0 O enoughDataFlag = 200;
0 e) B% D) U! _! v) Q7 _/ @2 E3 y, `$ o
int myfuvk1;
4 H& ?$ C, {) a) N& e! [ myfuvk1 =11;
6 _1 Q5 O" O) _+ \
7 H) W S/ g, m; P; [+ p
! T2 A: H4 Z8 z enough_data = 0;
) H. ^$ J% [* }, ~. e i, C$ N
/ U" ?3 W% y8 b$ S, J/ k- P// if(enough_data>50){# Q+ L. L& s8 L: Q
// enoughDataFlag=0x01;% n/ Y9 E+ i s9 u0 [2 @$ v' C7 H
// }else if(enough_data<50){6 p2 q% ?5 c3 e ~4 N
// enoughDataFlag=0x00;//0x00还是不行
4 X& G+ p9 z' |1 S2 S// }
/ y7 }- p$ s* B: v- f# T' t& F2 \* `' d$ R
6 N+ C$ X+ }6 x
oo=10;
- ^$ K$ Q6 |) C- l8 f5 R- V oo = oo < 5;
: y0 q; |0 K% i; J. z$ G if(oo){ s/ c# P+ x+ n- L/ k ]; h9 J9 f/ F
ii=0;
- C: _: o, i! O' T }& A5 D$ I! y2 L3 E) m: |4 \/ ~
if(oo < 5){
4 Y" q& r2 s Z% r1 G/ _+ g ii=0;
; |( N8 w# u9 B8 s, X }, g" \& G( b$ G
if(oo > 5){* O% H d( a0 ^2 M# t
ii=0;, y8 L# M/ M' w0 {( `1 ^3 q4 q0 M! {
}, s6 G& u/ d8 p, C1 G
% {: d( y# ~2 {1 O* l4 f) | C0 B, A
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */0 w5 R/ ` j7 C6 d ^, p) d3 |
/* 如果数据足够才执行主程序 */
9 G& e9 r* X5 \% O" R# V: m- w$ H" Z oo = oo < 5;" V* f' s4 t3 S. K
enoughDataFlag = enoughDataFlag < 5;+ z+ r) p7 [* V$ u
if (enoughDataFlag < 5) {1 E @# Y* ?( x* `' W
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
: t3 g2 g6 t5 X AGC_AGC(&pAGC);
' [& _. Q0 M/ G; f- \& ^5 `( {( U V# ?) {0 a& ^3 {
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
: T" v8 ]/ H1 b2 m, I% \ FIRDecimator_FIRDecimator(&pRxFilter);+ l8 J/ V7 r/ i8 n4 v$ t/ ~
( T2 [% C a( x& O /* Downsampling */
: f, l5 u* x: K3 ` c_SymbolSynchronizer_SymbolSync(&pTimingRec);
9 r/ p' Q! b5 ^- N, E/ c/ W E; f5 t* H4 H( {' _
c_PreambleDetector_PreambleDete(&pPrbDet);+ j& O* N2 H1 p+ B6 H& y' Q
2 A+ F! G: l4 z3 t6 }
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
0 r! Z& ?# Q. Z! X4 s /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
$ T3 B8 @/ H$ U. H- `- B /* %帧数量=100 */
: O; u% S( V4 q2 P pFrameSync.isInitialized = 0;/ V. w2 s* v$ a! |/ k
) Z8 _5 t( t/ d" b0 b! e9 k- a2 C
/* [EOF] */1 g7 y0 k9 L; h- W9 w# U0 u$ q
/* 前导码长度是13 */# b9 F7 h' E" Z! M9 X
/* %qpsk */$ h1 ]; ]" P. i/ M+ }+ f
pDataDecod.isInitialized = 0;( s- k/ S8 H2 m8 @: S9 ~6 r
: i, W& _6 W. N
/* end */7 ^& Q u% J9 ~7 m
/* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
, ]3 ^, L. K* I% ]7 g /* Convert 3-dB frequency */" C9 }8 C! ^3 `: _
/* Convert 3-dB frequency *// \- C% R+ {( s1 i
filtfilt(save_buffer, usable_left_filtfilt);. L9 [# J/ d% r. h8 K5 N
for (ixstart = 0; ixstart < 81000; ixstart++) {
6 A; m; ~# Z' Y/ I" o* z* v usable_left_filtfilt[ixstart] *= 2.0;2 f/ v# S% {4 M p; b
}: E7 k+ c/ i/ [
" ~; c: K, m, P: v3 i5 Z /* 注意乘2,处理幅度 */
" v3 u. T" _% n- L5 E5 k /* %% 我发现带通之后其实就均值为0了,不用这一步了 */1 Q1 A% w/ {$ i( h( `
/* %% 行列转换 */
( K! B2 I" U$ O5 d3 a yiDuanShuJu_mean = b_mean(usable_left_filtfilt);) b; p2 T6 ~5 f: J& A
for (ixstart = 0; ixstart < 81000; ixstart++) {
1 R) }5 }" O) z0 A youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
% a0 A! Y# y O+ [( V - yiDuanShuJu_mean;
: j+ K7 z2 u( i$ B( y }
1 n z; j6 a9 A' K
8 `- O. g) w0 [* o( L- E /* %% 应该对数据归一化,但是这一步放在哪比较好 */* c2 Q l# y9 ^( b9 @
ixstart = 1;
- z6 P8 `" o$ O. ~) q6 M mtmp = youXiaoShuJu_QuZhiLiu[0];
6 x$ N" B( C4 [' s# l if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
2 m7 K+ f/ B, n/ m4 \ ix = 2;+ b7 g" u* T' k% z; f/ y
exitg2 = false;, C5 w! M, N* q J& w, @8 }/ `
while ((!exitg2) && (ix < 81001)) {
& J3 A$ u# F0 S% M ixstart = ix;' V$ y) E% }, V: ]# o
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {0 k" Z# ?! B1 N! j. F0 N
mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
5 g# O; [* P. O7 X( S exitg2 = true;
- F9 w8 Q- F+ l7 M, ^7 X4 M: g$ A& ^ } else {
% |' W, z7 T9 E ix++;) k' x% U8 H- e$ x: `8 C- p
}
" F6 w1 w4 h) G! K" S }* _9 S8 R* e& D0 _
} _2 |4 r9 F* p O! w
8 e0 g; `: G5 M a8 [ ^ if (ixstart < 81000) {
! T& A4 N2 b/ G" E while (ixstart + 1 < 81001) {
7 l- s1 R. Q$ v4 e if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
* e2 H- Q/ D: ^# ^7 B \, b! O mtmp = youXiaoShuJu_QuZhiLiu[ixstart];
' Z0 S9 W7 G3 M }
, y z9 N' H& l- U0 K7 B' e( f: F. K7 P' P. v+ E; o
ixstart++;
3 d; u- n" s* M! @* ?& G5 h; ^ }7 A9 T) V* _. T3 C7 S4 [7 u
}
5 Y* G" v/ E: U7 h
. t' L& d2 r- V$ E ixstart = 1;- G. c4 w' G" f e9 o
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
+ c3 c' [6 a- u0 s" R1 `: l5 U) } if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
1 v" P `7 p7 O7 i9 q ix = 2;
' o$ d8 K+ G9 W exitg1 = false;" \ C9 n, Z& M s
while ((!exitg1) && (ix < 81001)) {
8 i9 A% E8 l& a ixstart = ix;
! j& x8 c) w9 s/ Y if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {1 p# T/ V" _+ ~1 z! ^
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];( c( F) b9 H& f# J' ]
exitg1 = true;. T; X: D5 P) v- v" D
} else {
& H7 N; [9 ?1 k" l2 i ix++;
3 c$ O/ u$ i, S; G5 p/ b9 z3 h }# r% ~! @% D6 {
}
; _* v `) C; ` }3 J r# m+ _/ S+ n
" c0 X* g3 U4 B* R A
if (ixstart < 81000) { I( V3 \3 _0 S
while (ixstart + 1 < 81001) {( n+ e1 V$ {3 c7 x: h3 y7 o
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {' N4 u& E0 L* J
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
; H+ q# F, ?, d4 ^& F0 [9 a }7 f7 R* l! e& M4 L4 j
2 F4 a) ^, O$ b# C8 r5 T ixstart++; N6 t: O0 T: E" N
}, J `/ A) _' K- B5 U3 ~. G5 x
}
. x1 M" [5 p* S% l
$ K5 V7 p$ D/ c8 G r7 a& L% s, T yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
* Y( s! r. A0 C4 w8 N" \5 L if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
: Q3 I+ B& A: J2 I# ^ yiDuanShuJu_mean = mtmp;4 z% h* [; P8 r* O
}/ v8 C9 u6 E/ z7 d& L
- P0 g: E: |1 P- ]+ | /* 找出极值 */
# n; p1 d/ a( R' v/ P for (ixstart = 0; ixstart < 81000; ixstart++) {
/ n* q* }$ n5 | youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
- N+ v+ W& K( A. n+ ` }
4 e' b( t0 N* s. U/ { K( Q& v }5 d
! K6 ]: B1 m0 F7 D+ H --------------帖子字数限制------------------
- i6 e$ h: q$ j ` [' K}# [# k; M6 G) S% J5 Y
- H, W: e7 M1 P t; h6 e
8 i& L) ]: e. K9 ^% x |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|