|
|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑
1 Y% Z W$ `' F# u8 b4 O5 y' i) ]9 L9 h4 [, f) @4 S& p. Z6 V
各位大神:* G# x1 ^1 w0 \" j' g
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)2 M9 [% I; }! i
我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:, K' G5 m( v" |* Q' J
) X& Y' L6 W1 ?' W; t
7 v# m, a8 M' }6 R: R3 [, f3 R这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。
+ i6 G O$ k4 M2 K6 A6 e* l6 m" z, b% k
并没有其他线程+ h$ w6 ^2 ^$ _" \' `0 ~+ }
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。8 S t# J$ J; W
也说不定是和堆栈有关系。。。。。。
4 ^: R$ @6 V) n$ A2 p5 G/ t5 ^请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....
2 c! f+ L. B* i( w" j
2 B; Z% S- V" l: ]3 m! u7 @' ]
7 p% l5 U# C7 O4 k5 J6 W% s% [% D5 s) f8 E) S f9 a; d
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
L: V6 r3 s/ [# A8 p. i
: [+ }9 B3 A5 C8 ]3 [) G
2 p7 C5 y, c: V) Z, a附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];' D8 _; _: t+ f* b) Y0 r
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。& _! W* C9 K8 N
9 A$ |$ S3 g) m7 ?8 rboolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
# }$ D2 F! V/ g: x; @. U) [4 s/ e" F const double data1000[1000]) {6 a6 H5 t1 @1 Z7 T
v+ b( \) ~) I, Y+ ^% q8 {( s! t
int myfuck;6 G( d. C' E' G1 o
double yiDuanShuJu_mean;8 f+ z( X, Q6 Z+ T6 p& w+ I
double yiDuanShuJu_LowMean[1000];
, T$ N7 K4 p( \, o int ixstart;+ R5 h; }, n4 t' ?) G0 Z
double dv0[1000];
& k, x7 m: x2 ]5 `: V comm_AGC pAGC;
- ?3 d9 P% V! Q5 \4 Y5 L comm_CarrierSynchronizer pFineFreqCompensator;
" M# m, F) h: U8 K dspcodegen_FIRDecimator pRxFilter;
& @" t& Q" n3 J, _ comm_SymbolSynchronizer pTimingRec;' R" A$ O0 O; g) [0 E, X* y$ d) P% f
comm_PreambleDetector pPrbDet;6 `( l% a: ?2 \: K
FrameSynchronizer pFrameSync;
P. \7 f2 h' I) O, q& U6 i2 l QPSKDataDecoder pDataDecod;" S: n5 B$ d. o
static double usable_left_filtfilt[81000];, e8 m3 t) R( p8 G8 G# W" E6 r
static double youXiaoShuJu_QuZhiLiu[81000];
( |, C1 r; g6 @6 _) q! } double mtmp;
. ^. H: _- W u2 @# V9 A int ix;$ n3 H; b5 K2 c- w" R8 T
boolean_T exitg2;
8 l) z. p8 f# T3 p& S" [4 z1 a1 G boolean_T exitg1;8 s9 f6 `4 D7 i$ d1 U! c1 T
double YiZhenShuJu[800];
$ l' ` m* |8 \! b! D% U double dv1[800];6 f2 H! f% J8 z% k. H2 R* G. }
* l) [4 A! n2 h8 f
9 W% U2 l9 k2 U/ }: D; ^ double b_YiZhenShuJu[800];
0 G0 T8 h0 f; ` double I_filtfilt[800];
3 @% Y8 L ^4 C' z6 e t+ K5 \ double Q_filtfilt[800];. m1 V; H% u& w& R
creal_T b_I_filtfilt[800];
. R8 ?) I5 g) Z; j creal_T b[800];4 w: x. g1 _8 H5 d
creal_T RCRxSignal[50];
6 y5 o- k7 n5 o3 E x7 d4 [ creal_T fineCompSignal[50];( H& z' S$ F- s# G
double phError[50];8 B1 M6 K4 p, v+ d
creal_T timingRecSignal_data[28];8 ?4 p ~ M7 c# \( d
int timingRecSignal_size[1];. ?/ q& O, @* T @# ]
double prbIdx_data[28];
6 f3 T( T, V5 ]) D7 k int prbIdx_size[1];2 l# T( t/ E, y# u; O
double dtMt_data[28];) u+ m, ]' c3 y
int dtMt_size[1];1 n7 H6 F" \ H
creal_T symFrame[25];- q2 ~. Y. x4 j' D% r
boolean_T isFrameValid;6 R. ?1 c! j/ U( g t N$ u
double unusedU0[3];
/ K( A1 W c: I4 U
]0 v7 z3 O5 p; \, M- M //调试过程中的变量& e9 t5 D: `( j& N0 k3 g' A
int enough_data;
+ s: e' r: K1 w4 [& p/ ~
! \( m& e# w/ N6 g% \6 Q int enoughDataFlag;0 {0 u% ]( K5 ^ O3 f- j
int yiDuanShuJu_mean_int;
/ k' N2 Q6 \( Y6 |$ a7 L int int_sum_dv0;; X. s: u2 H9 H
int oo;/ n. E9 H$ _, l# x
int ii;
5 o, R Z" p. z" h z# H1 Q myfuck=10;& D( R! W; T' ]% O6 S, y% U
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */: S( J- k$ ?6 P' E9 u
/* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
( U8 z/ t1 O* r' W! R3 O6 ?9 ~( u: T9 |
yiDuanShuJu_mean = mean(data1000);
7 A8 Q) h% O0 B' a2 V% H# c: L. A+ q) q T3 u$ j
yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;3 |( |' u- H, ~/ o* ]
UARTPutc('A');
- O5 k4 q' P/ U$ F0 g! V* v# L UARTPutNum(yiDuanShuJu_mean_int);& ]% C$ I4 S" i& s9 N
UARTPutc('\r');
. n" J' z+ n- K3 z# Q1 ]4 | UARTPutc('\n');; x$ E$ `7 v8 E! v1 z( l8 N
- \" f3 Z) x+ g! R% x for (ixstart = 0; ixstart < 1000; ixstart++) {9 b p3 Y& _' G9 y5 O
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;3 H, M' B; }1 a# r+ I v. Y
}
. r6 p+ N6 ~: n B# j! j! s/ e/ a
5 y. E% s3 ]' J7 q7 ]3 P9 t power(yiDuanShuJu_LowMean, dv0);
! u- C; |1 m7 u" \* a8 y; d* o/ ]7 z1 }: \
0 r3 r$ o4 e3 z4 r4 Y2 S int_sum_dv0 = (int) sum(dv0);. U+ u; N- N9 _& Y1 z
; Z" D: ^6 d9 @: w" V UARTPutc('B');( k+ I, S [( D( z% J2 z$ k( l
UARTPutNum(int_sum_dv0);; U) W/ d, \$ _7 V1 C$ g
UARTPutc('\r');% I. H) A- r4 x5 g" g8 T$ q
UARTPutc('\n');
: `+ G& b: Q' I7 W7 g# [. Q# S0 a8 _7 c( q6 j/ ^1 I: P$ B
// int compareFlag = int_sum_dv0 > 1.0E+8;
B( o2 N* x& t8 T5 b- Q+ t2 |7 X+ o7 W; p' i" n
if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
; q9 b- W8 l1 @ UARTPutc('C');
2 b: v( y$ }0 f- ^) N /* 比较信号能量 */
# e) {" \' u: r F. y, J. `+ i /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
' {2 ?& q' d h% D$ k// yiDuanShuJu_mean = 1000.0 * youxiao_k;
+ }: n% Q' z+ X# ]0 B# ^// for (ixstart = 0; ixstart < 1000; ixstart++) {
- F8 U* @0 n- Q* d// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =) G" [% Z& M4 b- |
// yiDuanShuJu_LowMean[ixstart];
# A+ }! \3 q/ s E' h2 _// }
; T) W% i" Y4 p1 `1 h! |//; ]# ?) D% L! Q" a9 a1 T4 s6 {$ E
// youxiao_k++;1 g; m$ s( T8 y4 b: m% T
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==2 b2 L$ i( }" {, U6 L
// /* 感觉要取21个数,即0-20, */' c' g" |" j9 G$ R/ Z4 L( W! e
// enough_data = 10;//有效是10,无效是0: Q1 E0 O: H1 e
// }* l# S e5 F8 Z
}5 M9 |/ c: k5 v: U" B _# \: W7 n
! F( ~0 N* s( u- x# G8 r, E4 D
. H/ U! J% a1 `1 I4 O
enoughDataFlag = 100;# P$ q: Y. M6 a; h
enoughDataFlag = 1000;! R) v) i7 f3 E; z; ~
enoughDataFlag = 0x02;
5 ] X4 J; C" Q$ @3 Z7 m enoughDataFlag = 200;5 A' c# S4 d/ @# c6 U* x+ X6 y
. b4 G; T" ~# h u$ U8 K
int myfuvk1;! c( g" A7 A! M' `: q4 o
myfuvk1 =11;
' _) i9 J. Q' x' O
9 T7 T$ n h% [, l4 @, D1 f' v1 H7 M2 H! S/ u
enough_data = 0;
$ f* Q) q3 H/ A' w# R0 f8 e/ P$ y2 o8 [# @: e8 F& O/ ^8 }. e
// if(enough_data>50){# l" C/ \3 k1 B# { L* E3 y
// enoughDataFlag=0x01;; G6 _+ m5 I) @2 r7 G% P
// }else if(enough_data<50){
; }$ J x" v0 S// enoughDataFlag=0x00;//0x00还是不行3 h4 r. C- ]- v( @9 k& _
// }3 _0 K9 ^, f c, J# J( K
8 s" \& W4 ]5 o9 s D; h3 G! K: z; M" X* t2 ]4 [: j
oo=10;
8 ?9 ]# l v6 a) i oo = oo < 5;/ ]) q9 B( E7 d3 k- m$ X
if(oo){1 _7 ]5 z9 z. s4 s
ii=0;# O% J* @' V- H- l1 A
}
9 l1 \% Q6 O- O* w if(oo < 5){/ d S: ?' [! R: Z
ii=0;9 g6 z3 d" }+ [- c& C" x6 p
}
) M( V2 |& h+ ~4 `. x+ B- O if(oo > 5){
3 E2 G# V! I3 Z4 N1 J6 _- g ii=0;
! c7 u! L& f- B) D5 L d6 S3 r }; N, c3 J0 ^% [& t K1 m
6 Z% u) _ E" r4 Y7 I/ K, @) W
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */
8 @7 J5 C0 l/ @: ? /* 如果数据足够才执行主程序 */
h$ s) Y. y) g. x( {8 r O; ? oo = oo < 5;" ?5 \# {( x* V' I3 C3 i
enoughDataFlag = enoughDataFlag < 5;$ [5 S3 X; V1 Q. J% Z
if (enoughDataFlag < 5) {4 b2 h& G6 ~/ S. G& v+ K. n7 V
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
/ f. ~& e* a: a0 `1 o, M) `6 h AGC_AGC(&pAGC);
3 Y, O& b) t) J
5 {2 A7 N9 d; n5 T8 Z0 f' ` c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);# d w1 X- {. _! c- V
FIRDecimator_FIRDecimator(&pRxFilter);/ @. M/ A1 |' d* s
q G ?$ Z+ u( w/ ?' g /* Downsampling */. o- s& j8 j" h% M, p3 H1 @$ I
c_SymbolSynchronizer_SymbolSync(&pTimingRec);
1 L. A( U0 t- i( y, x' \) |: [
1 O# q0 t0 ?. y7 B2 F1 G c_PreambleDetector_PreambleDete(&pPrbDet);
! l6 _. q7 H+ C5 U4 _# U
, L! L7 d7 Z6 T& t /* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */. Q. z9 R$ @$ e
/* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
/ X3 q! {6 L l. m: i% e( q /* %帧数量=100 */) M0 b- o, r9 b `' p$ b6 |9 x$ z
pFrameSync.isInitialized = 0;
3 J$ K8 s: x6 x. _8 F. A! N
( d, m1 e Q5 J/ s, y* {2 U /* [EOF] */* P3 q7 U4 `" x* e! w$ t
/* 前导码长度是13 */
, \ h+ x& G7 u! \7 T9 N /* %qpsk */) F; [* |- i8 h( f* l9 o7 ]
pDataDecod.isInitialized = 0;
3 F0 [/ m: _: D# l' Q# y6 n& A! s. B! u
/* end */
# k: t6 e9 i2 h. I- \ /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
4 K% P6 L: w' Z0 I. }; M5 f- b /* Convert 3-dB frequency */' |! P" J* C: N- @! @6 H
/* Convert 3-dB frequency */: i, V1 \& {. F5 a3 g
filtfilt(save_buffer, usable_left_filtfilt);
, E6 ]) S- ?9 }2 r7 e7 E for (ixstart = 0; ixstart < 81000; ixstart++) {
8 J4 E% } K% S, H- M+ W) L usable_left_filtfilt[ixstart] *= 2.0;- X0 a6 R3 @3 L: `6 U
}% ]1 P8 [5 r9 ?2 K8 Q: U
& u% z) y& w: H4 Z3 s
/* 注意乘2,处理幅度 */
! d6 f1 E& a! h" F: z+ A /* %% 我发现带通之后其实就均值为0了,不用这一步了 */2 B) h7 k" ]% ~2 q& o7 |. J# k; i
/* %% 行列转换 */
9 D O: U) L! Q6 E6 A- W6 m1 \7 ] yiDuanShuJu_mean = b_mean(usable_left_filtfilt);8 o' n5 W& E: F0 `
for (ixstart = 0; ixstart < 81000; ixstart++) {
, S0 M) `5 s4 O4 j ]' l youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]
4 \, B, _1 j* ]4 J* l& j - yiDuanShuJu_mean;) e3 p4 q/ o0 B0 `8 H* R- i8 j
}
$ l% |9 y" p) ^3 U4 t" R# h3 N" g) u8 `2 J3 |3 e0 r
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
m6 E1 d6 q5 n% v# b' x6 Q ixstart = 1;" R3 V; A( k) V. s. C
mtmp = youXiaoShuJu_QuZhiLiu[0];: X+ U: s- k- ^: v
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
# _: r9 Q6 b' y9 ~0 @6 \) M ix = 2;
$ o& U4 D$ r3 T" B: f exitg2 = false;8 x- U8 X3 B0 e; A
while ((!exitg2) && (ix < 81001)) {- W' Y- M% X! F8 }
ixstart = ix;% \! U( |7 u6 N
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
/ L$ M0 H& r2 @& N" @ S& i mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];
k$ M' \$ J$ L6 W8 G exitg2 = true;
# c7 \" c! @" x4 M& h$ e/ w } else {; |) {. S: J# q" r: i
ix++;
u1 }* U: j, \0 D }9 j% ^! L9 l) y3 v1 `
}
6 ?: L- C7 r0 `6 ^% j3 n9 N( ` }8 [: E) H" r, V+ ]# C7 A( m L1 T
0 h' i p/ t0 R, o& K) @ ~
if (ixstart < 81000) {1 u: w! v; g, r/ g+ C
while (ixstart + 1 < 81001) {
) }; P U7 P \. W+ T if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {, y- C+ _9 _4 ~& @! ^) m8 V
mtmp = youXiaoShuJu_QuZhiLiu[ixstart];& I- Q i' B8 B1 q
}& {6 F* _" o3 S; E! C8 ?
/ {- |$ N$ w# J" ` ixstart++;
* ]8 l5 V; |; a1 I9 E4 R" Z8 r+ ` }/ w. C$ L) X$ Z' X0 J
}% X# ?4 i+ `- { k0 L
+ J R, v* n7 w8 @5 E ixstart = 1;* r" P/ N1 n) U5 q. G
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];
. `8 P$ i) G! l1 o6 C4 U. S if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {
7 V. w- d `) G% V( i; ~ ix = 2;. t. n% ~7 O M2 n' Y2 d: x8 n
exitg1 = false;, ?% }/ _+ I3 n
while ((!exitg1) && (ix < 81001)) {
6 b$ D9 W$ V3 v0 h ixstart = ix;
4 j7 L$ J; Y; w$ M( X5 N6 C+ I; b if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
S4 [7 d1 T$ B4 l' f1 B yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
4 D# }- ]9 M9 B: O* y2 \# j exitg1 = true;
' R- X/ A1 n2 l7 E4 ]- `' J' H8 ^ } else {+ X6 L, H% M) S& J3 `" x
ix++;
2 n4 P4 W2 O5 _# B$ S }
- k; } H; L8 Y6 L# S% i }
2 F+ ]8 H6 D) G0 F0 ^; D }$ T3 X+ i5 A" W. t; @- n% n, i
4 b0 Y1 [; r- x7 C2 R" a" \$ F& G0 L" u
if (ixstart < 81000) {1 \$ ~; J) K. \
while (ixstart + 1 < 81001) {
& p) r. a K, j0 ` if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
+ o) U! d1 J: H1 ]8 k+ \# g2 z1 L yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];% O+ A L( G a: s8 N# |# k4 j
}. s3 U! t# N3 M) W: A. }' F. |
/ Z. b6 z6 K8 v! i ixstart++;- y `' \' n0 c1 @8 I! l
}
* J' w/ z% J3 {( f, k }+ m& A5 O1 [7 M1 ]# R
7 ` G4 P5 b7 p; F# i* I
yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
3 }3 I% M/ r9 ` if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {
5 @; ]3 g& d' `! d K7 N0 @ yiDuanShuJu_mean = mtmp;
8 ?2 D; Y! @5 O" O; o }' t3 f1 |' F7 q- b: Y- r0 Q- \
! Q# S$ D0 V7 l- v, j
/* 找出极值 *// [! |+ x0 G9 ` D/ g$ a( E
for (ixstart = 0; ixstart < 81000; ixstart++) {
- u3 `) x$ A! s! k" ]! p q7 r5 m3 k) i. U youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;
; H! y9 J, M3 Y3 A4 y0 S }
! `1 I" O0 z1 c K% o8 I9 J% [3 m! N: J Z
--------------帖子字数限制------------------1 Y' U0 u; v* T0 L# u7 c( \9 @. h
}
1 N8 V. E. G; _- h( ~. C6 O5 [7 U: a
6 P' H# J# w) z! \( o9 S1 c7 | |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|