реклама на сайте
подробности

 
 
> передискретизация, как?
TigerSHARC
сообщение Feb 22 2010, 16:22
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Здравствуйте.
Есть сигнал:

Fs = 6400;
N = 128;
Ts = 1/Fs;
T = Ts*N;
f = 45;
t = 0:Ts:T-Ts;
A = 10;
Y = A*sin(2*pi*f*t)+ A*sin(2*pi*2*f*t)+ A*sin(2*pi*3*f*t);

как и какой функцией в MATLAB пересчитать частоту дискретизации с 6400 на 5760.
Причём с тем же числом отсчётов (128).

Это нужно для корректировки спектра сигнала.
Дело в том, что когда меняю частоту "руками":

Fs = 5760;
N = 128;
Ts = 1/Fs;
T = Ts*N;
f = 45;
t = 0:Ts:T-Ts;
A = 10;
df = Fs/N;
f1 = 0:df:Fs-(Fs/N);
Y = A*sin(2*pi*f*t)+ A*sin(2*pi*2*f*t)+ A*sin(2*pi*3*f*t);
X = fft(Y)/length(t);
>> stem(f1, abs(X)), grid

получается красивый спектр, отражающий верную информацию об амплитудах сигнала.
Пробовал для передискреизации функцию resample, но она выдаёт меньшее число отсчётов и спектр искажён...

да и вообще, не толкьо в MATLAB, как из 128 отсчётов получается 128 передискретизированных отсчётов... полюбому время выборки должно как-то варьироваться...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
TigerSHARC
сообщение Feb 22 2010, 17:23
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



тогда так.
1) при интерполяции всегда используется фиксированное число отсчётов с АЦП?
2) количесвто отсчётов(идущих на блок БПФ) после ресемплинга остаётся прежним? (в моём случае 128)

Просто использую я и фильтр фарроу на С и матлаб... ну не получается и всё... когда руками меняю частоту

Fs = 5760;
N = 128;
Ts = 1/Fs;
T = Ts*N;
f = 45;
t = 0:Ts:T-Ts;
A = 10;
df = Fs/N;
f1 = 0:df:Fs-(Fs/N);
Y = A*sin(2*pi*f*t)+ A*sin(2*pi*2*f*t)+ A*sin(2*pi*3*f*t);
X = fft(Y)/length(t);
>> stem(f1, abs(X)), grid

тогда всё окей.
но тогда и меняется и длинна окна (стала 0,0222).
как это при ресемплинге происходит?
Go to the top of the page
 
+Quote Post
bahurin
сообщение Feb 22 2010, 17:33
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 22 2010, 18:00
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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 бы увидеть положительный результат.
Go to the top of the page
 
+Quote Post
bahurin
сообщение Feb 22 2010, 18:07
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 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 периодов колебания
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 02:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016