Wednesday 5 July 2017

Bergerak Rata Rata C Source Code


Saya tahu ini bisa dicapai dengan dorongan sesuai: Tapi saya benar-benar ingin menghindari penggunaan dorongan. Saya telah googled dan tidak menemukan contoh yang sesuai atau mudah dibaca. Pada dasarnya saya ingin melacak rata-rata bergerak aliran arus dari sejumlah angka floating point dengan menggunakan 1000 nomor terbaru sebagai sampel data. Apa cara termudah untuk mencapainya? Saya bereksperimen dengan menggunakan array melingkar, moving average eksponensial dan moving average yang lebih sederhana dan menemukan bahwa hasil dari array melingkar sesuai dengan kebutuhan saya yang terbaik. Tanya 12 Jun 12 at 4:38 Jika kebutuhan Anda sederhana, Anda mungkin hanya mencoba menggunakan rata-rata bergerak eksponensial. Sederhananya, Anda membuat variabel akumulator, dan saat kode Anda melihat setiap sampel, kode akan memperbarui akumulator dengan nilai baru. Anda memilih alpha konstan yaitu antara 0 dan 1, dan hitung ini: Anda hanya perlu menemukan nilai alfa dimana efek sampel tertentu hanya bertahan sekitar 1000 sampel. Hmm, saya tidak yakin ini cocok untuk anda, sekarang saya sudah meletakkannya disini. Masalahnya adalah bahwa 1000 adalah jendela yang cukup panjang untuk rata-rata bergerak eksponensial Im tidak yakin ada alfa yang akan menyebar rata-rata selama 1000 nomor terakhir, tanpa arus dalam perhitungan floating point. Tapi jika Anda menginginkan rata-rata yang lebih kecil, seperti 30 angka atau lebih, ini adalah cara yang sangat mudah dan cepat untuk melakukannya. Jawab 12 Jun pukul 4:44 di posmu Rata-rata pergerakan eksponensial dapat memungkinkan alfa menjadi variabel. Jadi, ini memungkinkannya digunakan untuk menghitung rata-rata basis waktu (misalnya byte per detik). Jika waktu sejak update akumulator terakhir lebih dari 1 detik, Anda membiarkan alpha menjadi 1.0. Jika tidak, Anda bisa membiarkan alpha menjadi (usecs sejak update1000000 terakhir). Ndash jxh 12 Jun 12 at 6:21 Pada dasarnya saya ingin melacak rata-rata bergerak aliran arus dari sebuah angka floating point dengan menggunakan 1000 nomor terbaru sebagai sampel data. Perhatikan bahwa di bawah ini update total sebagai elemen sebagai tambahan yang ditambahkan, hindari tumpang tindih O (N) untuk menghitung jumlah yang dibutuhkan untuk rata-rata - sesuai permintaan. Total dibuat parameter yang berbeda dari T untuk mendukung mis. Menggunakan panjang yang panjang bila total 1000 s panjang, int untuk char s, atau double to total float s. Ini sedikit cacat pada numsamples yang bisa melewati INTMAX - jika Anda peduli Anda bisa menggunakan unsigned long long. Atau gunakan anggota data bool tambahan untuk merekam saat wadah pertama kali diisi saat bersepeda mendekati numamples di sekitar array (terbaik kemudian berganti nama menjadi sesuatu yang tidak berbahaya seperti pos). Dijawab 12 Jun 12 at 5:19 seseorang mengasumsikan bahwa operator quotvoid (T sample) quot sebenarnya adalah quotvoid operatorltlt (T sample) quot. Ndash oPless 8 Jun 14 jam 11:52 oPless ahhh. Baik terlihat Sebenarnya saya bermaksud untuk itu menjadi operator void () (sampel T) tapi tentu saja Anda bisa menggunakan notasi apa pun yang Anda sukai. Akan memperbaiki, terima kasih. Ndash Tony D 8 Jun 14 di 14: 27Apakah mungkin menerapkan rata-rata bergerak di C tanpa memerlukan jendela sampel, saya telah menemukan bahwa saya dapat mengoptimalkan sedikit, dengan memilih ukuran jendela yang merupakan kekuatan dua untuk memungkinkan sedikit Pergeseran bukan membagi, tapi tidak membutuhkan penyangga akan menyenangkan. Apakah ada cara untuk mengungkapkan hasil rata-rata bergerak baru hanya sebagai fungsi dari hasil lama dan sampel baru Tentukan contoh rata-rata bergerak, di atas jendela 4 sampel menjadi: Tambahkan sampel baru e: Rata-rata bergerak dapat diimplementasikan secara rekursif. , Tapi untuk kalkulasi rata-rata bergerak yang tepat, Anda harus mengingat sampel masukan tertua dalam jumlah (contohnya dalam contoh Anda). Untuk panjang N rata-rata bergerak yang Anda hitung: di mana yn adalah sinyal output dan xn adalah sinyal input. Pers. (1) dapat ditulis secara rekursif. Jadi Anda harus selalu mengingat sampel xn-N untuk menghitung (2). Seperti yang ditunjukkan oleh Conrad Turner, Anda dapat menggunakan jendela eksponensial (jauh lebih panjang) sebagai gantinya, yang memungkinkan Anda menghitung keluaran hanya dari keluaran lalu dan masukan saat ini: namun ini bukan rata-rata bergerak standar (tanpa bobot) namun secara eksponensial. Rata bergerak tertimbang, di mana sampel lebih jauh di masa lalu mendapatkan bobot yang lebih kecil, tapi (setidaknya secara teori) Anda tidak akan pernah melupakan apapun (bobotnya semakin kecil dan kecil untuk sampel jauh di masa lalu). Saya menerapkan rata-rata bergerak tanpa memori item individual untuk program pelacakan GPS yang saya tulis. Saya mulai dengan 1 sampel dan bagi 1 untuk mendapatkan nilai rata-rata saat ini. Saya kemudian menambahkan sampel anothe dan membagi dengan 2 ke avg saat ini. Ini berlanjut sampai saya mencapai panjang rata-rata. Setiap saat setelah itu, saya menambahkan sampel baru, mendapatkan rata-rata dan menghapus rata-rata dari total. Saya bukan seorang matematikawan tapi ini sepertinya cara yang bagus untuk melakukannya. Kupikir itu akan mengubah perut orang matematika sejati tapi, ternyata itu adalah salah satu cara yang bisa diterima untuk melakukannya. Dan itu bekerja dengan baik. Ingatlah bahwa semakin tinggi panjang Anda semakin lambat, mengikuti apa yang ingin Anda ikuti. Itu mungkin tidak masalah sebagian besar waktu tapi ketika mengikuti satelit, jika Anda lamban, jejaknya bisa jauh dari posisi sebenarnya dan akan terlihat buruk. Anda bisa memiliki celah antara duduk dan titik-titik trailing. Saya memilih panjang 15 update 6 kali per menit untuk mendapatkan smoothing yang memadai dan tidak terlalu jauh dari posisi duduk sebenarnya dengan titik jepret yang merapikan. Jawab 16 16 pada 23:03 menginisialisasi total 0, count0 (setiap kali melihat nilai baru Kemudian satu masukan (scanf), satu menambahkan totalnewValue, satu kenaikan (hitungan), satu rata-rata pembagian (jumlah total) Ini akan menjadi rata-rata bergerak di atas Semua input Untuk menghitung rata-rata hanya di atas 4 masukan terakhir, akan memerlukan 4 variabel input, mungkin menyalin setiap masukan ke inputvariable yang lebih tua, kemudian menghitung rata-rata pergerakan baru. Sebagai jumlah dari 4 variabel input, dibagi 4 (pergeseran kanan 2 akan menjadi Baik jika semua input positif membuat perhitungan rata-rata dijawab 3 Feb 15 at 4:06 Itu benar-benar akan menghitung rata-rata total dan TIDAK rata-rata bergerak. Seiring bertambahnya dampak, setiap sampel masukan baru menjadi sangat kecil ndash Hilmar Feb 3 15 di 13:53 Jawaban Anda 2017 Stack Exchange, algoritma IncC untuk moving average eksponensial nol-lintang Terakhir Diubah: 2012-08-13 Saya telah mencoba menerapkan cutoff frekuensi rendah di c yang pada dasarnya mengambil aliran angka dan smoo Keluaran keluar (menyaring pemindah frekuensi tinggi), namun penting nomor tertimbang di depan dianggap segera karena datanya sangat kritis (ini adalah untuk mengendalikan basis simulasi gerak dengan menggunakan keluaran dari sedikit perangkat lunak permainan). Ive punya algoith rata-rata bergerak tertimbang bekerja tapi bisa dilakukan dengan sesuatu yang sedikit lebih responsif di ujung depan, dan saya menemukan ini: - Kode pseudo ada sebagai berikut: Input: Price (NumericSeries), Period (NumericSimple) Variables: Faktor (0), lag (0) jika CurrentBar lt 1 kemudian mulai ZLEMA Faktor harga 2 (Period1) lag (Periode-1) 2 akhir lainnya memulai faktor ZLEMA (2Price-Pricelag) (1-faktor) Akhir ZLEMA1 saya telah menerjemahkannya di Ke C dan kode saya adalah sebagai berikut: Namun, sepertinya tidak berperilaku cukup seperti yang diharapkan Id. Tampaknya hampir ada tapi kadang-kadang saya mendapatkan nilai yang sedikit lebih rendah daripada semua item dalam antrian (ketika semuanya lebih tinggi). Antrean saya dan jumlah item di dalamnya dilewatkan sebagai parameter, dengan yang paling baru berada di depan setiap saat, juga saya melewati sebuah meja incrementing mulai dari 0 seperti yang dipersyaratkan oleh fungsinya. Saya tidak yakin bahwa saya telah menafsirkan makna ZLEMA1 dengan benar karena tidak jelas dalam pseudocode-nya, jadi saya menganggap ini sebagai panggilan terakhir zlema dan juga Im dengan asumsi Harga sebenarnya berarti Price0. Mungkin saya sudah salah ini Apakah saya seharusnya menyalin nilai zlema aktual yang dihitung kembali ke antrian asli saya sebelum panggilan berikutnya Saya tidak mengubah antrian asli sama sekali selain hanya menggeser semua nilai satu sampai akhir dan memasukkan yang terbaru dari awal . Kode yang saya gunakan untuk melakukan ini adalah: Akan sangat bersyukur jika seseorang dengan pemahaman matematika yang lebih baik dapat memberi kewarasan untuk memeriksa apakah saya mendapat sesuatu yang sedikit salah. Terima kasih banyak sebelumnya jika Anda dapat membantu Pertama terima kasih atas semua Masukan Anda, sangat dihargai Itu masuk akal saya kira, jadi saya kira maka yang terbaik yang bisa saya harapkan hanyalah sebuah moving average eksponensial, menerima akan ada sedikit lag tapi ini akan diminimalkan dengan bobot di atas yang lebih berat daripada yang diberikan pada bobot tipikal. Moving average Saya memiliki algoritma ini juga, tapi masalah yang sama dengan nilai yang nampaknya tidak benar (kecuali ini adalah sifat dari rumus). Sebagai contoh, katakanlah array saya berisi 16 nilai, semua 0,4775 - outputnya adalah 0,4983, tapi Id mengharapkannya menjadi 0.4775 Apakah ini terlihat benar untuk Anda. Moving Average eksponensial. Float va, float va, int numVals, int currentSample) faktor float statis 0 float static float lastema 0 float ema if (currentSample lt 1) ema vals0 factor 2.0 (((float) numVals) 1.0) else ema (factor vals0) ((1.0 - faktor) lastema) emema emema ema ema Sebaliknya, kadang outputnya lebih rendah dari masing-masing dan setiap masukan, meski semuanya lebih tinggi. Hal ini disebut dengan cara yang sama seperti zlema (.) Di atas, dengan penghitung incrementing. Rumus dan pseudocode untuk yang satu ini ada di sini: - autotradingstrategy. wordpress20091130exponential-moving-average Terima kasih sekali lagi, mohon maaf atas kesalahpahaman saya tentang beberapa dasar :( Salam, Chris J Seperti kode yang saya posting, youre benar tentang ukuran array Situasi yang harus mudah diperbaiki .. Adapun pertanyaan Anda: 1) Konstanta filter mewakili cutoff frekuensi. Saya menggunakan Digital Signal Processing (DSP) untuk teknik ini. En. wikipedia. orgwi kiLow-pas sfilter adalah penjelasan sederhana. Anda menginginkan bagian Realisasi Waktu Diskrit. Dalam kasus saya, A adalah RC-Constant yang mereka bicarakan. Jadi frekuensi yang dipotong adalah di atas 1 (2piA). Jika Anda tidak memiliki pemahaman tentang teori Frekuensi-Domain, ini mungkin akan menjadi rumit. Dalam kasus Anda, Semakin tinggi Anda membuat A, semakin rendah frekuensi yang akan diizinkan filter ini, artinya akan memperlancar kurva lebih banyak dan lebih banyak. Semakin rendah Anda membuatnya, semakin banyak suara yang diperbolehkan di sistem. Ingat A harus lebih besar dari atau sama dengan 1 untuk menjadi efektif. Saya kembali memasang XLS lagi, kali ini tanpa nomor rand () berubah. Sesuaikan A konstan dan perhatikan bagaimana quotsmoothsquot (atau menyaring) variasi frekuensi tinggi. 2) Poin terakhir dari array input memiliki nilai terbaru. 3) Hal yang sama berlaku untuk array output. Yang terakhir adalah nilai terakhir. 5) NUMVALS itu sewenang-wenang. Anda dapat terus menambahkan ke input dan output array sebanyak yang Anda suka dan itu tidak akan mempengaruhi filter. Secara khusus, saya menggunakan 49 poin. Tapi saya bisa dengan mudah menghapus 20 terakhir dan 29 keluaran pertama akan tetap sama. Fungsi ini tidak didasarkan pada berapa banyak poin yang digunakan. Saya ingin menyebutkan bahwa saya mengembangkan fungsi ini untuk konversi satu kali. Jika Anda ingin melakukan konversi untuk nilai berikutnya dengan cepat, Anda bisa mencoba sesuatu yang lebih sederhana (seperti terlampir). Sekali lagi saya berkarat pada c. Saya harap ini benar. Satu-satunya hal yang perlu Anda suplai adalah konstanta masukan dan filter. Beritahu saya jika ini membantu.

No comments:

Post a Comment