|
本帖最后由 zhangsan1231 于 2017-6-8 16:54 编辑 1 h3 f& n7 w5 N5 n$ w+ _
4 B# H+ O5 N$ [1 S2 A7 R+ z8 v: ?
各位大神:2 o$ F/ T. Z. ]# W' Z" `7 o8 Q
你们好,这是我第3次在论坛提问了,感谢各位大神的帮忙,又要麻烦你们。(/(ㄒoㄒ)/~~)
) o* o8 b# L L- z$ r' w 我遇到一个很怪的问题,就是在debug时程序运行的莫名其妙。上图:
6 i' O8 G6 s1 _) {4 \
! v: v" _) g; ?+ [ 9 y7 ^! R- o5 X
这debug时候,程序已经运行到左侧箭头所指向的位置了,按理说enoughDataFlag这个变量应该是已经赋值为1000了,但是右上角显示这个变量的值并不是1000。我是真的搞不懂了,多次测试也是这样。只能来求教各位大神。8 U% }- I0 o8 ?- P/ @; d
6 X0 y7 j" E: z6 N8 v" W" S' u P+ L
并没有其他线程' ^# Z; E; ?+ k
反复思考,观察,我感觉应该是程存溢出了,所以程序都在乱跑,没有任何规律可言。7 P" T' i* e! K0 N! ]" b' M
也说不定是和堆栈有关系。。。。。。/ R$ U8 F( g& v$ H) ^
请问各位大神,这里的堆和栈的大小应该设置成多少?我把栈设置成0x4ff,堆设置成0x3ff有没有问题?我随便写的数....8 S) D% F% Y+ w8 {
) _* U0 W5 }! N4 y2 A
5 U* V7 ]6 h R4 j2 e9 _2 M
G. G1 R. X7 {9 t; _
我也很绝望啊,希望大神能帮帮忙,感激不尽,!
" n. h0 K' Q2 C4 H( g
. n* L! t H6 t+ O
% v. {) ]- ]% l ~3 h附上代码部分:是关于QPSK通信的一个程序,在这个函数里有特别大的数组 static double usable_left_filtfilt[81000];% |) B. s# j: x& Q _2 D
static double youXiaoShuJu_QuZhiLiu[81000];是不是这两个数组影响了程序?我也说不准。。。。。。
$ N9 U2 z. p* m7 b9 K7 Z0 q1 m" R% O; l2 W1 _1 f i
boolean_T runQPSKSystemUnderTest_KongQiXinDao_RX_v6_toC(
; G; O) E+ d) z1 M/ y2 Q const double data1000[1000]) {7 _+ H& }( C7 M2 C9 w
4 V/ u+ D" |: P B0 }3 V6 @7 ^, Y
int myfuck;! |8 a/ u9 l! ~/ J& r# c* K4 W
double yiDuanShuJu_mean;
7 y" ]4 ~( ^. u( L2 C4 \9 f, o* b double yiDuanShuJu_LowMean[1000];9 ~0 Q- K) k: F( \* ?- y5 B# G
int ixstart;
% @7 `$ c# Q1 R+ ?8 ~' x double dv0[1000];
( ]* h1 k5 z7 x7 E5 ^ comm_AGC pAGC;2 B7 W }3 P/ X
comm_CarrierSynchronizer pFineFreqCompensator;
; W+ h% d1 q+ N2 B dspcodegen_FIRDecimator pRxFilter;: Q w" B' s3 @1 r6 @' H# g; {
comm_SymbolSynchronizer pTimingRec;# z8 E5 M$ P) o3 D8 k5 Q0 W a5 R: b
comm_PreambleDetector pPrbDet;, V8 }4 t: y4 o) u
FrameSynchronizer pFrameSync;* k8 m2 s, k9 p8 r
QPSKDataDecoder pDataDecod;
4 m2 i) H4 x9 [0 s static double usable_left_filtfilt[81000];
6 X. \6 r" p1 d V$ { static double youXiaoShuJu_QuZhiLiu[81000];* _- J# g1 h4 o7 D( ?) {; w
double mtmp;
7 j+ v0 Z& m" K, ], P6 _ int ix;* l# d, t U; W, n2 @9 N# Q
boolean_T exitg2;
6 z: B4 D- M" r9 q% e2 i boolean_T exitg1;
1 e7 C* h, ]& f' q( M9 A" S0 U* p double YiZhenShuJu[800];
: Z7 N2 h: h/ D7 q, }; Z4 N double dv1[800];0 P5 a; Q# e5 W
# A) c: h8 \2 F/ [( p1 M3 }) |& p- l l- T
double b_YiZhenShuJu[800];
, E4 A6 p3 I0 \; H double I_filtfilt[800];
9 y8 ]4 i6 |7 c double Q_filtfilt[800];
$ G2 F1 `0 d7 K0 \ creal_T b_I_filtfilt[800];) l5 b! q# n% Y+ L2 A
creal_T b[800];1 g, ]- T' G2 J, H
creal_T RCRxSignal[50];' Z# W8 X: a* |! b) H; _
creal_T fineCompSignal[50];" u2 t* D9 ?" F7 u- n0 O4 Q
double phError[50];
7 z) v/ ^6 v, A. f( u; W creal_T timingRecSignal_data[28];8 T+ ^6 w8 c* [- u; c2 v
int timingRecSignal_size[1];, R! m+ b0 K$ h
double prbIdx_data[28];
0 q: c/ G. p( n2 _ int prbIdx_size[1];% G8 ~8 Q7 K; s4 h" O" \3 i
double dtMt_data[28];
! n# z" C: e# s( `8 u8 @ int dtMt_size[1];) u8 D# X7 Y( z, p& g
creal_T symFrame[25];
' Q, u6 v, u2 S# B boolean_T isFrameValid;
4 }9 g% c6 I0 r double unusedU0[3];
# {" P/ s2 ?) n' d' z6 T% Z# I
6 p+ E& Z& w( ]+ h //调试过程中的变量
. P( @0 N( J. A% b6 { G int enough_data;
2 Y* k2 |$ A% z3 Q
0 I4 R; K' o7 A% p- X+ x# s9 f int enoughDataFlag;
6 `2 G* o/ R5 z }5 a: Y int yiDuanShuJu_mean_int;
: _( I* @- ^2 g3 v6 a( g$ V int int_sum_dv0;7 R7 B$ Q+ r8 S4 I! p1 @% _; p
int oo;
) U* b: H: R1 X8 c2 e; [& E. p4 \ int ii;
: ]: `, b4 V) m/ Y* j myfuck=10;5 {6 O4 x% _1 I9 W0 s' [
/* 模拟真实的DSP情况,确定信号的位置,计算能量,不要归一化,每次取4000个数据,第一个4000个还不能算数, */
. w; H* z! i: F' f0 J/ Y% [ /* 考虑到最开始一帧,和最后一帧,可能取的不准,那就之后再考虑, */
! `) b4 P7 k9 Z
: i0 ?/ F5 N- Z yiDuanShuJu_mean = mean(data1000);
" G8 i! P2 j! a
Y4 F* n8 B3 y! ]5 s5 u yiDuanShuJu_mean_int = (int) yiDuanShuJu_mean;
6 m8 d. I9 K4 i' @, T3 Y UARTPutc('A');8 ^) V& P' |' z( m
UARTPutNum(yiDuanShuJu_mean_int);7 a2 d9 N. k3 \; m& c
UARTPutc('\r');
# z" u1 P& c) P/ b t ]/ K' X9 ` UARTPutc('\n');) \; P* Z' u9 @$ W. C9 T" L# x3 [
/ g2 g/ L: s5 \- E; M for (ixstart = 0; ixstart < 1000; ixstart++) {/ A1 J [. S+ C# K# n( l1 v
yiDuanShuJu_LowMean[ixstart] = data1000[ixstart] - yiDuanShuJu_mean;
( S6 X9 y; {# o4 z# B }
^6 [& ^! v" v' a0 k# O0 ^+ A( v: L6 p2 ^+ M' I8 s
power(yiDuanShuJu_LowMean, dv0);; H- n) e1 N& F# w& h- a2 |
" R* h$ Q5 R7 ]
int_sum_dv0 = (int) sum(dv0);+ Q8 O) R( f# X9 W; z
/ r8 W9 o+ R; J- Y) y6 ` UARTPutc('B');
* K; D1 q% q$ E! W3 E0 l0 L# D UARTPutNum(int_sum_dv0);' d, _1 u1 X, B V" G- l0 B! I
UARTPutc('\r');) c3 i/ I+ |- e: a
UARTPutc('\n');
- u* q3 U0 V0 W, J$ c+ S" |( z3 R! Z1 X- h# u' Q
// int compareFlag = int_sum_dv0 > 1.0E+8;
9 |/ ?2 b* Z4 H( `
, n6 X# D2 S! v2 c: N1 P4 b! W if (int_sum_dv0 > 100000000) { //之前这里是double和int比较的,能行吗?
( l9 @$ m4 V0 I/ ^6 g. J1 v6 N UARTPutc('C');' N( Z1 b9 ?# ?* `% P6 K. k
/* 比较信号能量 */
% q) w' z3 N | /* fprintf(' signal_mean=%d signal_energy=%d \n',yiDuanShuJu_mean,EnergyOf_yiDuanShuJu_LowMean);%只有有效的部分才打印出来 */
3 y+ E1 [- c5 s) P0 O// yiDuanShuJu_mean = 1000.0 * youxiao_k;
) _- L# \4 u7 d! k% ~2 r6 g! f# Y# ` U// for (ixstart = 0; ixstart < 1000; ixstart++) {, G1 F# r% E# L) Y
// save_buffer[(int) (yiDuanShuJu_mean + (1.0 + (double) ixstart)) - 1] =6 Z4 g6 O+ u1 v2 u& j! a
// yiDuanShuJu_LowMean[ixstart];" d/ {# N4 e& i& {& U; b2 e# a9 K, p- n
// }
3 k% y8 D' t/ j- I, {* j//
3 Y! }5 y8 [# [/ e3 q4 ^// youxiao_k++;+ Z- m' u/ j% c* ]2 e2 o2 l, P5 g
// if (youxiao_k == 81.0) {//这个程序也是有问题的!不能用==, _8 N* s8 m8 w# y
// /* 感觉要取21个数,即0-20, */
M3 ^ t4 k* u# Q; |// enough_data = 10;//有效是10,无效是0* W, K1 t4 |/ r7 P9 d
// }2 g4 R3 y$ K# I3 I
}5 G% o, ~1 G/ k3 p- j( d H
. y" b/ O8 L! \* Q
4 Z7 B. D" A8 u' U5 B6 x0 V
enoughDataFlag = 100;
$ [. F: @" [6 P8 O0 x, _7 Q enoughDataFlag = 1000;$ U& ]0 r. A r) [3 r
enoughDataFlag = 0x02;
2 _' w/ L8 @+ j* y& u! y E enoughDataFlag = 200;
1 l6 R @: D; J: F
6 h. A: R( I! m" k# m int myfuvk1;7 N+ x9 w8 p2 P
myfuvk1 =11;
- c- O2 t4 Y1 y! \8 u* g8 ?( ] b: k" P' K
' @' G# J& U7 i enough_data = 0;
7 j4 f" z* o% P% d" p8 \
8 L& l4 |% i |8 t9 S// if(enough_data>50){
. v1 C( e5 e1 u+ [// enoughDataFlag=0x01;
( M* Q, C7 q( o! r# z5 S' d# R, [// }else if(enough_data<50){* K6 E& W7 d3 r4 h" j
// enoughDataFlag=0x00;//0x00还是不行9 [1 C x) `0 P3 j. ^0 m9 O3 u
// }% f- D1 b X2 @5 T
: p8 j s# u8 K$ }+ d8 ?: \
5 J1 L9 D/ X4 ^4 @, z+ B$ Y& g; z oo=10;1 @6 W& Q$ G- N" S- _
oo = oo < 5;
" l+ B* ?% P# [% t* n; D L( Z+ [ if(oo){
7 e d1 L% _& m4 m ii=0;
2 ]1 t/ o Z3 O4 ^6 s& @* A }- h8 ~; z7 E( k/ {' s
if(oo < 5){
8 I* S; u5 {' O/ Z) N" Y3 X9 K4 l ii=0;% e% F' f7 ]9 Q$ t
}2 Z2 @6 C& t7 C2 y0 }5 k+ E
if(oo > 5){
$ x1 A: f9 k. \- b ii=0;
, H; q! S. G' \, F }
) m8 K) O4 p# T. r* S: |! {2 R$ o6 h p1 g& |, m. Q; h: f: Q
/* save_buffer =usable_left(2.3e5+1:2.3e5+8e4+4000); */8 _) ]4 b/ k5 u8 u, J8 k/ Q
/* 如果数据足够才执行主程序 */
$ R+ C! u; b7 \3 P, _. l1 x5 f oo = oo < 5;
; U/ K8 o! ]( U5 I: c enoughDataFlag = enoughDataFlag < 5;
. r. ]( N9 J' @: y* U4 I0 d4 m if (enoughDataFlag < 5) {8 G' f# L* Y$ o: P( J. I- x
// if (fabs(enoughDataFlag)>0.2) {//有效是10,无效是0
) v) x' x' |. Q; C2 k9 ~& z$ ` AGC_AGC(&pAGC);4 I" s5 [3 |. \3 Z2 j
: s: d/ O. b* k( h4 \
c_CarrierSynchronizer_CarrierSy(&pFineFreqCompensator);
7 _' A) Z3 j( K9 J$ h$ `) F FIRDecimator_FIRDecimator(&pRxFilter);
( O( q" z4 S/ @, R
1 t& p, h# N! }3 s /* Downsampling */
/ s4 P/ r- l7 M4 w* ] c_SymbolSynchronizer_SymbolSync(&pTimingRec);
& d' s. c3 z( |1 r; G' D0 T
0 Z2 s3 t, D* k7 u3 o; U) [ c_PreambleDetector_PreambleDete(&pPrbDet);
9 q. I1 b- O" P2 c4 k) Z6 k4 V% q9 ?+ c! w; Q* O5 S
/* 'Threshold', 8);空气信道情况下,把阈值从8改成7 */
; }6 B9 j1 w. e7 ~, F, A /* %帧同步,第一次听说啊。。帧同步和前导码是相关的吗% */
4 l$ V) |% o' k7 e! t) G /* %帧数量=100 */
% j3 G5 j5 t0 ~. ^# d3 o pFrameSync.isInitialized = 0;
- H1 p: x) J+ U/ t/ \1 ]9 F' h; q4 p' `
/* [EOF] */
/ c' ? I8 c( }8 ^6 T1 v) L /* 前导码长度是13 */
0 u, K: [9 W6 G- e$ ?4 n, F /* %qpsk */
/ a |# F- Q9 C7 v: G D5 l6 \ pDataDecod.isInitialized = 0; X8 ?2 O5 I% n) Y7 q0 ?: D7 Y
; s3 s. ^! I1 M( l /* end */
+ R7 c) K9 S# C /* %% 进来的数据先过带通滤波器,带通3k-21k(看音乐分析软件确定的这个值) */
& j; ]% _& J5 |* k" d* g1 H1 ^* B z" ]9 ~ /* Convert 3-dB frequency */) d/ \7 t- z: W( K2 }$ ~4 F
/* Convert 3-dB frequency */9 `6 a$ b1 v1 l& B
filtfilt(save_buffer, usable_left_filtfilt);# g: L$ [- h/ S9 l; U# `
for (ixstart = 0; ixstart < 81000; ixstart++) {; S. M+ H6 K$ @- x1 E9 ^
usable_left_filtfilt[ixstart] *= 2.0;
& x3 ?1 v! S% T' S* K }2 l/ ]/ p$ g5 C
; ?5 E, S6 C- S- b; r) f* Q /* 注意乘2,处理幅度 */& Y# f- |3 {, ~; z7 Q$ K' {- r$ g) P1 N1 a
/* %% 我发现带通之后其实就均值为0了,不用这一步了 */
* h, C8 q7 g5 ^; |* E3 i; j' w% h /* %% 行列转换 */ ^6 p6 K. t: G6 G2 C
yiDuanShuJu_mean = b_mean(usable_left_filtfilt);/ K- K2 b$ q0 I' Q
for (ixstart = 0; ixstart < 81000; ixstart++) {
. [# Z( P6 F( l' Z/ f youXiaoShuJu_QuZhiLiu[ixstart] = usable_left_filtfilt[ixstart]) u$ |0 c9 ]# B( t
- yiDuanShuJu_mean;
& n+ N# U B7 q0 a7 c/ a5 g. a }8 ]8 R8 l; h) ~
$ p9 N. u C9 U0 s
/* %% 应该对数据归一化,但是这一步放在哪比较好 */
0 ? ?2 }4 F0 ?$ B# L- H ixstart = 1;
. i: i- J. W, }. [4 y* \ mtmp = youXiaoShuJu_QuZhiLiu[0];: S4 |' G5 i! c$ ?
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {0 I8 a0 S% S' M$ t; d+ n9 m3 W/ {
ix = 2;3 Y9 L) l' k, ]0 Q9 k
exitg2 = false;
/ g8 z- X. C9 S' w! V" u& m3 } while ((!exitg2) && (ix < 81001)) {
1 v0 |. d0 F8 L J1 R) {9 t ixstart = ix;5 ~8 D" z$ | L$ e4 H
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {
' c& F) ?# a/ h1 ^3 E( w6 ] mtmp = youXiaoShuJu_QuZhiLiu[ix - 1];3 a8 N! @( u1 e* p; k
exitg2 = true;
. T$ ]# U2 |# j5 @$ P } else {
- j+ [6 Q$ {* V3 ?" O# @" h ix++;2 x% {4 d9 p- W) w8 @
}( f: R9 K/ l5 e/ j( w
}
/ ^# Z$ q. d% [' Y }7 `8 Y4 w! D4 v$ k' _
% r( I4 V0 e3 p if (ixstart < 81000) {+ `. H* R, l4 f2 |
while (ixstart + 1 < 81001) {- F; n: f* J0 @2 N8 A! H* }4 z1 n( }
if (youXiaoShuJu_QuZhiLiu[ixstart] > mtmp) {
2 A( G/ C) M& U R- _ mtmp = youXiaoShuJu_QuZhiLiu[ixstart]; r9 \0 l' G$ ~4 J+ \. F
}
8 g$ R6 t2 c9 b7 P6 A+ u, a" Q' @+ @( x( B
ixstart++;" Z! ^7 D( Q1 ], S5 C
}
' h7 y# V9 _4 N' q }# C" {7 c8 F: {! ]( o# R3 v$ l
# v( @% @8 [7 ~5 t
ixstart = 1;
; y$ m$ }' R/ a: M" o yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[0];9 l% u) Y* [, s% A2 I
if (rtIsNaN(youXiaoShuJu_QuZhiLiu[0])) {: \. I- s: {+ V8 t8 k$ E
ix = 2;2 T% ~; }/ t3 d1 r, E5 Z% V
exitg1 = false;+ ]1 G" z1 n* h( [' b
while ((!exitg1) && (ix < 81001)) {
- y h& g1 A( y0 o7 [& r ixstart = ix;) h5 v g9 n5 F3 g, d# `' h
if (!rtIsNaN(youXiaoShuJu_QuZhiLiu[ix - 1])) {, G0 X0 @( w7 K8 c7 p: ?- p: h
yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ix - 1];
0 D2 v9 p" {& S- W exitg1 = true;/ `' [: n k' ^# _
} else {
; s7 P0 G C8 V' K ix++;$ h8 c ^& g$ R0 N( m$ z4 ~9 Z
}
w$ F9 B$ S, p6 D }! W" r, ?! G/ k, \. X
}. ]) T* n9 G. w2 o: X5 t
7 H$ {% c$ x7 O; I
if (ixstart < 81000) {, ?( C' ^6 r1 M+ }+ i3 Q8 e
while (ixstart + 1 < 81001) {7 s! Q$ C* T& |. d
if (youXiaoShuJu_QuZhiLiu[ixstart] < yiDuanShuJu_mean) {
' I H/ B3 P( h2 I4 u. ] yiDuanShuJu_mean = youXiaoShuJu_QuZhiLiu[ixstart];
6 q1 |( n2 y3 O% J }, e/ P* c5 F4 ], ~
7 L9 V9 v# ~2 Y4 c! p% k! k$ M
ixstart++;9 L4 R' y. m' E/ r7 W- `
}$ H3 \- Y6 t) T% _- `- v J
}3 D, H" W4 j s4 A; R
# I9 Y: s4 q) | yiDuanShuJu_mean = fabs(yiDuanShuJu_mean);
$ V0 }$ V5 E3 y if ((mtmp >= yiDuanShuJu_mean) || rtIsNaN(yiDuanShuJu_mean)) {' }4 X+ ?% q' D( u
yiDuanShuJu_mean = mtmp;
! L: R+ N- n' U }
% A! E6 ]* {7 K. ~( |1 h; X
9 O! D l$ _" q, m% U /* 找出极值 */
- c5 M' K* O$ h0 m for (ixstart = 0; ixstart < 81000; ixstart++) {
5 n# {3 T& }; T j youXiaoShuJu_QuZhiLiu[ixstart] /= yiDuanShuJu_mean;5 V1 J2 D* ~: Z9 I! k4 [
}& L% n& N% w7 M5 J2 @" a
* ?& w% ^: v* n' y# u# z" B
--------------帖子字数限制------------------
4 i2 _; a0 @" \( l- X5 ?; [1 }0 Y}0 o9 t% i* V& o4 f
% B5 E+ V6 w% n6 N4 G
+ l; m& z' w! ~3 W |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|