|
передискретизация, как? |
|
|
|
 |
Ответов
|
Feb 22 2010, 17:33
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347

|
Цитата(TigerSHARC @ Feb 22 2010, 20:23)  как это при ресемплинге происходит? Если частота понижается, то для сохранения количества отсчетов ПОСЛЕ ресамплинга надо уведить ИСХОДНОЕ количество отсчетов, потом применить рэсамплер. Код #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979323846
// Функция сохранения результатов анализа в текстовый файл для // построения графиков. void saveToTXT(double* t, double* s, int n, char* fileName){ FILE *file = fopen(fileName, "w"); if(!file) return; for(int i = 0; i < n; i++) fprintf(file,"%e\t%e\n",t[i],s[i]); fclose(file); }
// Функция расчета кубического полинома // на основе модифицированного фильтра Фарроу double farrow3(double *y, double x){ double a3 = (y[3]-y[0])/6.0+(y[1]-y[2])/2.0; double a1 = (y[3]-y[1])/2.0-a3; double a2 = y[3]-a3-a1-y[2]; return x*(x*(x*a3+a2)+a1)+y[2]; }
int main(){ double Fs0 = 16E3; // исходная частота дискретизации double Fs1 = 12E3; // частота дискретизации после ресэмплинга int K = 128;// количество отсчетов после ресэмплинга int N = (int)K*Fs0/Fs1;// количество исходных отсчетов // выделяю память под исходный сигнал double* y0 = (double*) malloc(N*sizeof(double)); double* t0 = (double*) malloc(N*sizeof(double)); // выделяю память под результат ресэмплинга double* y1 = (double*) malloc(K*sizeof(double)); double* t1 = (double*) malloc(K*sizeof(double)); // формирую исходный сигнал for(int i = 0; i<N; i++){ t0[i] = double(i)/Fs0; y0[i] = cos(2*M_PI*3E3*t0[i]); // гармоническое колебание на частоте 3 кГц. } // произвожу ресэмплинг for(int i = 0; i<K; i++){ t1[i] = (double)i/Fs1; // текущий момент дискретизации int j = int((double)i*Fs0/Fs1)-2; // пересчитываю индекс исходного сигнала if(j<0) j =0; // если индекс отрицателььный то приравниваю его к 0 double x = (t1[i]-t0[j])*Fs0-2; // пересчитываю значение x y1[i] = farrow3(y0+j, x); // фильтр Фарроу t1[i] *= 1E3; // перевожу время результата ресэмплинга в мс } // перевожу исходное время в мс for(int i = 0; i<N; i++){ t0[i] *= 1E3; } // сохраняю результат в файлы saveToTXT(t0, y0, N, "исходный сигнал.txt"); saveToTXT(t1, y1, K, "resampling.txt"); system("Pause"); return 0; } все работает.
Сообщение отредактировал bahurin - Feb 22 2010, 17:40
|
|
|
|
|
Feb 22 2010, 18:00
|
Знающий
   
Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195

|
Цитата(bahurin @ Feb 22 2010, 20:33)  Если частота понижается, то для сохранения количества отсчетов ПОСЛЕ ресамплинга надо уведить ИСХОДНОЕ количество отсчетов, потом применить рэсамплер. Код #include <stdio.h> #include <stdlib.h> #include <math.h> #define M_PI 3.14159265358979323846
// Функция сохранения результатов анализа в текстовый файл для // построения графиков. void saveToTXT(double* t, double* s, int n, char* fileName){ FILE *file = fopen(fileName, "w"); if(!file) return; for(int i = 0; i < n; i++) fprintf(file,"%e\t%e\n",t[i],s[i]); fclose(file); }
// Функция расчета кубического полинома // на основе модифицированного фильтра Фарроу double farrow3(double *y, double x){ double a3 = (y[3]-y[0])/6.0+(y[1]-y[2])/2.0; double a1 = (y[3]-y[1])/2.0-a3; double a2 = y[3]-a3-a1-y[2]; return x*(x*(x*a3+a2)+a1)+y[2]; }
int main(){ double Fs0 = 16E3; // исходная частота дискретизации double Fs1 = 12E3; // частота дискретизации после ресэмплинга int K = 128;// количество отсчетов после ресэмплинга int N = (int)K*Fs0/Fs1;// количество исходных отсчетов // выделяю память под исходный сигнал double* y0 = (double*) malloc(N*sizeof(double)); double* t0 = (double*) malloc(N*sizeof(double)); // выделяю память под результат ресэмплинга double* y1 = (double*) malloc(K*sizeof(double)); double* t1 = (double*) malloc(K*sizeof(double)); // формирую исходный сигнал for(int i = 0; i<N; i++){ t0[i] = double(i)/Fs0; y0[i] = cos(2*M_PI*3E3*t0[i]); // гармоническое колебание на частоте 3 кГц. } // произвожу ресэмплинг for(int i = 0; i<K; i++){ t1[i] = (double)i/Fs1; // текущий момент дискретизации int j = int((double)i*Fs0/Fs1)-2; // пересчитываю индекс исходного сигнала if(j<0) j =0; // если индекс отрицателььный то приравниваю его к 0 double x = (t1[i]-t0[j])*Fs0-2; // пересчитываю значение x y1[i] = farrow3(y0+j, x); // фильтр Фарроу t1[i] *= 1E3; // перевожу время результата ресэмплинга в мс } // перевожу исходное время в мс for(int i = 0; i<N; i++){ t0[i] *= 1E3; } // сохраняю результат в файлы saveToTXT(t0, y0, N, "исходный сигнал.txt"); saveToTXT(t1, y1, K, "resampling.txt"); system("Pause"); return 0; } все работает. у них там да. А вы задайте частоту дискретизации 6400 для синуса c частотой f0 = 45,35Гц. при выборке N = 1024 (такое соотношение частоты дискретизации и количества выборок дают верный спектр лишь при f0 = 50Гц, так как тогда в окне ровно 8 периодов), а мы же для f0 = 45,35Гц здесь видим нецелое число периодов в окне. затем попробуйте передискретизировать этот синус на на частоту 5804.8 (заметьте дробная частота получается как N/8*f0) и должны увидеть целое количесвто периодов в окне. Но в моих экспериментах с этим кодом получается ерунда при передискретизации. Ну бог с ним, с эти кодом С-шным. Хотябы в MATLAB бы увидеть положительный результат.
|
|
|
|
|
Feb 22 2010, 18:07
|

Местный
  
Группа: Участник
Сообщений: 240
Регистрация: 20-09-08
Пользователь №: 40 347

|
Цитата(TigerSHARC @ Feb 22 2010, 21:00)  Но в моих экспериментах с этим кодом получается ерунда при передискретизации. ставьте Код
double Fs0 = 6400; // исходная частота дискретизации double Fs1 = 5804.8; // частота дискретизации после ресэмплинга int K = 1024;// количество отсчетов после ресэмплинга int N = (int)K*Fs0/Fs1;// количество исходных отсчетов а также сигнал: Код
// формирую исходный сигнал for(int i = 0; i<N; i++){ t0[i] = double(i)/Fs0; y0[i] = cos(2*M_PI*45.35*t0[i]); // гармоническое колебание на частоте 3 кГц. } все замечательно работает. Количество входных отсчетов 1128 выходный 1024. На выходе ровно 8 периодов колебания
|
|
|
|
Сообщений в этой теме
TigerSHARC передискретизация Feb 22 2010, 16:22 Andron_ Цитатакак и какой функцией в MATLAB пересчитать ча... Feb 22 2010, 16:59 bahurin Передискретизацию можно выполнить на основе интерп... Feb 22 2010, 17:10 TigerSHARC с точки зрения такой науки как численные методы во... Feb 22 2010, 17:11 bahurin Цитата(TigerSHARC @ Feb 22 2010, 20:11) P... Feb 22 2010, 17:16  TigerSHARC Цитата(bahurin @ Feb 22 2010, 20:16) В шт... Feb 22 2010, 17:42   bahurin Цитата(TigerSHARC @ Feb 22 2010, 20:34) н... Feb 22 2010, 17:42 Andron_ чтобы число отсчетов осталось тем же, нужна экстра... Feb 22 2010, 17:19    TigerSHARC Цитата(bahurin @ Feb 22 2010, 21:07) став... Feb 23 2010, 13:12  megajohn Цитата(bahurin @ Feb 22 2010, 21:33) Если... May 30 2013, 13:04 Andron_ это что-то нереальное...
сдайте дилера, я тоже хо... Feb 23 2010, 16:38 TigerSHARC Здаётся мне у меня какие-то принципиальные затрудн... Feb 23 2010, 18:29 Andron_ вы не можете его "поджать" под временное... Feb 23 2010, 18:49 TigerSHARC Цитата(Andron_ @ Feb 23 2010, 21:49) вы н... Feb 23 2010, 18:58 Andron_ тью... "вон оно че, Михалыч"...
тогда, ... Feb 23 2010, 19:15 TigerSHARC Цитата(Andron_ @ Feb 23 2010, 22:15) тью.... Feb 23 2010, 19:40 leksa Здравствуйте!
Может быть вот такой вариант Вас... Feb 23 2010, 21:07 TigerSHARC на самом деле нужно просто передискретизировать си... Feb 23 2010, 21:28 leksa Цитата(TigerSHARC @ Feb 24 2010, 00:28) н... Feb 23 2010, 21:35 leksa За код - пожалуйста, тем более это ваш код в общем... Feb 23 2010, 22:41 Andron_ Цитатаresample не канает(((
пример
Fs = 6400;
N ... Feb 24 2010, 02:14 Andron_ только в коде нужно сначала передискретизацию сдел... Feb 24 2010, 03:52 TigerSHARC дело в том что нужно обеспечить отсутсвтие растека... Feb 24 2010, 10:09 TigerSHARC Или получилось из пустого в порожнее? по сути прос... Feb 24 2010, 11:43 SPACUM Реализуется с помощью фарроу-фильтра.
[/quote]
А... Feb 24 2010, 14:09 TigerSHARC Да, то что у меня получилось выше просто вырезает ... Feb 24 2010, 15:07 leksa Я прочитал документ по ссылке.
Из того что вы писа... Feb 24 2010, 15:36 TigerSHARC Уважаемый, leksa, если вы поняли суть алгоритма - ... Feb 24 2010, 16:32 TigerSHARC Уважаемый, leksa, если вы поняли суть алгоритма - ... Feb 24 2010, 16:36 thermit Дык, пауз во времени и не будет. Меняться будет чи... Feb 24 2010, 16:40 TigerSHARC Цитата(thermit @ Feb 24 2010, 19:40) Дык,... Feb 24 2010, 16:58 TigerSHARC Вобщем, прошу подсказать как сделать адаптивное вр... Feb 24 2010, 18:22 leksa TigerSHARC
Извините, но мне все-таки не до конца я... Feb 24 2010, 20:25 TigerSHARC Всё теперь стало ясно.
Объясняю суть проблемы. нео... Feb 25 2010, 10:53 Andron_ ЦитатаПолучается что, какого бы размера не был буф... Feb 25 2010, 11:52 thermit ЦитатаTigerSHARC:
уфер заполняется постоянно и цик... Feb 25 2010, 12:09 TigerSHARC ... а если делать так:
брать данные из буфера и вы... Feb 25 2010, 12:39 thermit Если ориетироваться на число отсчетов связанное с ... Feb 25 2010, 12:47 TigerSHARC Цитата(thermit @ Feb 25 2010, 15:47) Если... Feb 25 2010, 12:54 thermit ЦитатаТогда ждём пока не будет нужного количесвта ... Feb 25 2010, 12:59 TigerSHARC Подведём итог в теме.
Предисркретизация осужествля... Feb 25 2010, 19:17 Евгений Николаев 1. Время обработки всегда примерно одинаково, т.к.... Feb 26 2010, 15:37 TigerSHARC Да, нужно ещё учесть что планируется хранение пред... Feb 26 2010, 17:07 megajohn хоть тема и древняя, но нужная всегда.
В аттаче пр... May 30 2013, 15:42
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|