コード例 #1
0
ファイル: calibrate.py プロジェクト: sujaebi/AutoEq
def main():
    harman_nobass = FrequencyResponse.read_from_csv(
        os.path.join(DIR_PATH, os.pardir, os.pardir, 'compensation',
                     'harman_over-ear_2018_wo_bass.csv'))
    harman = FrequencyResponse.read_from_csv(
        os.path.join(DIR_PATH, os.pardir, os.pardir, 'compensation',
                     'harman_over-ear_2018.csv'))
    oratory1990 = measurements(
        os.path.join(DIR_PATH, os.pardir, 'oratory1990', 'data', 'onear'))
    crinacle = measurements(os.path.join(DIR_PATH, 'data', 'onear'))
    pairs = []
    for fr in crinacle:
        for candidate in oratory1990:
            if fr.name.lower() == candidate.name.lower():
                pairs.append((fr, candidate))

    fig, axs = plt.subplots(1, 3)
    fig.set_size_inches(25, 10)
    fig.suptitle('Crinacle Over-ear Calibration')
    description = 'Calibrated against oratory1990 measurements with headphones: '
    line_len = len(description)
    for fr, _ in pairs:
        if line_len > 240:
            description += '\n'
            line_len = 0
        description += f'{fr.name}, '
        line_len += len(fr.name) + 2
    description = description[:-2]
    fig.text(0.5, 0.93, description, ha='center')

    errors = []
    i = 0
    for fr, target in pairs:
        fr.compensate(target, min_mean_error=True)
        errors.append(fr.error)
        fr.raw = fr.error.copy()
        fr.error = []
        fr.target = []
        fr.plot_graph(fig=fig, ax=axs[0], show=False, color=f'C{i}')
        i += 1
    axs[0].set_ylim([-15, 15])
    axs[0].set_title('Individual Errors')
    errors = np.vstack(errors)
    mean = np.mean(errors, axis=0)
    std = np.std(errors, axis=0)

    fr = FrequencyResponse(name='Mean and Standard Deviation')
    fr.raw = mean
    fr.smoothen_heavy_light()
    fr.raw = fr.smoothed.copy()
    fr.smoothed = []
    fr.plot_graph(fig=fig, ax=axs[1], color='C0', show=False)
    axs[1].fill_between(fr.frequency,
                        mean - std,
                        mean + std,
                        facecolor='#c1dff5')
    axs[1].set_ylim([-15, 15])

    harman_nobass.plot_graph(fig=fig, ax=axs[2], show=False, color='C0')
    crinacle_bass = harman.copy()
    crinacle_bass.raw += fr.raw
    crinacle_nobass = harman_nobass.copy()
    crinacle_nobass.raw += fr.raw
    crinacle_nobass.plot_graph(fig=fig, ax=axs[2], show=False, color='C1')
    axs[2].legend(
        ['Harman over-ear 2018 w/o bass', 'Crinacle over-ear w/o bass'])
    axs[2].set_title('Crinacle Over-ear Target')
    axs[2].set_ylim([-15, 15])

    resources_dir = os.path.join(DIR_PATH, 'resources')
    os.makedirs(resources_dir, exist_ok=True)
    fig.savefig(os.path.join(DIR_PATH, 'resources', 'calibration.png'),
                bbox_inches='tight')

    crinacle_bass.name = 'Crinacle Over-ear Target with Harman Bass Boost'
    crinacle_bass.plot_graph(show=False,
                             file_path=os.path.join(
                                 resources_dir, 'crinacle_over-ear_bass.png'),
                             color='C0')
    crinacle_bass.write_to_csv(
        file_path=os.path.join(resources_dir, 'crinacle_over-ear_bass.csv'))

    crinacle_nobass.name = 'Crinacle Over-ear Target'
    crinacle_nobass.plot_graph(show=False,
                               file_path=os.path.join(resources_dir,
                                                      'crinacle_over-ear.png'),
                               color='C0')
    crinacle_nobass.write_to_csv(
        file_path=os.path.join(resources_dir, 'crinacle_over-ear.csv'))
コード例 #2
0
def main():
    harman_onear = FrequencyResponse.read_from_csv(os.path.join(ROOT_DIR, 'compensation', 'harman_over-ear_2018_wo_bass.csv'))
    harman_inear = FrequencyResponse.read_from_csv(os.path.join(ROOT_DIR, 'compensation', 'harman_in-ear_2019v2_wo_bass.csv'))
    oratory1990_onear = get_measurements(os.path.join(MEASUREMENTS, 'oratory1990', 'data', 'onear'))
    oratory1990_inear = get_measurements(os.path.join(MEASUREMENTS, 'oratory1990', 'data', 'inear'))

    dbs = [
        ('crinacle_inear', get_measurements(os.path.join(MEASUREMENTS, 'crinacle', 'data', 'inear')), None),
        ('crinacle_onear', get_measurements(os.path.join(MEASUREMENTS, 'crinacle', 'data', 'onear')), None),
        (
            'headphonecom_onear',
            get_measurements(os.path.join(MEASUREMENTS, 'headphonecom', 'data', 'onear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'headphonecom', 'resources', 'headphonecom_compensation_sbaf-serious.csv'))
        ),
        (
            'headphonecom_inear',
            get_measurements(os.path.join(MEASUREMENTS, 'headphonecom', 'data', 'inear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'headphonecom', 'resources', 'headphonecom_compensation_sbaf-serious.csv'))
        ),
        (
            'innerfidelity_onear',
            get_measurements(os.path.join(MEASUREMENTS, 'innerfidelity', 'data', 'onear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'innerfidelity', 'resources', 'innerfidelity_compensation_sbaf-serious.csv'))
        ),
        (
            'innerfidelity_inear',
            get_measurements(os.path.join(MEASUREMENTS, 'innerfidelity', 'data', 'inear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'innerfidelity', 'resources', 'innerfidelity_compensation_sbaf-serious.csv'))
        ),
        (
            'referenceaudioanalyzer_onear-hdm-x',
            get_measurements(os.path.join(MEASUREMENTS, 'referenceaudioanalyzer', 'data', 'onear', 'HDM-X')),
            None
        ),
        (
            'referenceaudioanalyzer_onear-hdm1',
            get_measurements(os.path.join(MEASUREMENTS, 'referenceaudioanalyzer', 'data', 'onear', 'HDM1')),
            None
        ),
        (
            'referenceaudioanalyzer_inear-siec',
            get_measurements(os.path.join(MEASUREMENTS, 'referenceaudioanalyzer', 'data', 'inear', 'SIEC')),
            None
        ),
        (
            'rtings_onear',
            get_measurements(os.path.join(MEASUREMENTS, 'rtings', 'data', 'onear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'rtings', 'resources', 'rtings_compensation_avg.csv'))
        ),
        (
            'rtings_inear',
            get_measurements(os.path.join(MEASUREMENTS, 'rtings', 'data', 'inear')),
            FrequencyResponse.read_from_csv(os.path.join(MEASUREMENTS, 'rtings', 'resources', 'rtings_compensation_avg.csv'))
        ),
    ]

    stds = []
    for name, measurements, original_target in dbs:
        print(f'Calibrating {name}...')
        # Find matching pairs
        pairs = []
        for fr in measurements:
            ref = oratory1990_onear if 'onear' in name else oratory1990_inear
            for candidate in ref:
                if fr.name.lower() == candidate.name.lower():
                    pairs.append((fr, candidate))

        fig, axs = plt.subplots(1, 3)
        fig.set_size_inches(30, 8)
        fig.suptitle(name)
        description = 'Calibrated against oratory1990 measurements with headphones: '
        line_len = len(description)
        for fr, _ in pairs:
            if line_len > 240:
                description += '\n'
                line_len = 0
            description += f'{fr.name}, '
            line_len += len(fr.name) + 2
        description = description[:-2]
        fig.text(0.5, -0.05, description, ha='center')

        errors = []
        i = 0
        for fr, target in pairs:
            fr.compensate(target, min_mean_error=True)
            errors.append(fr.error)
            fr.raw = fr.error.copy()
            fr.error = []
            fr.target = []
            fr.plot_graph(fig=fig, ax=axs[0], show=False, color=f'C{i}')
            i += 1
        axs[0].set_ylim([-15, 15])
        axs[0].set_title('Individual Errors')
        errors = np.vstack(errors)
        mean = np.mean(errors, axis=0)
        std = np.std(errors, axis=0)
        stds.append(FrequencyResponse(name=name, raw=std))

        fr = FrequencyResponse(name='Mean and Standard Deviation')
        fr.raw = mean
        fr.smoothen_heavy_light()
        fr.raw = fr.smoothed.copy()
        fr.smoothed = []
        fr.plot_graph(fig=fig, ax=axs[1], color='C0', show=False)
        axs[1].fill_between(fr.frequency, mean - std, mean + std, facecolor='#c1dff5')
        axs[1].set_ylim([-15, 15])

        ref_target = harman_onear if 'onear' in name else harman_inear
        ref_target.plot_graph(fig=fig, ax=axs[2], show=False, color='C0')
        target = ref_target.copy()
        target.name = name
        target.raw += fr.raw
        target.plot_graph(fig=fig, ax=axs[2], show=False, color='C1')
        if original_target is not None:
            original_target.plot_graph(fig=fig, ax=axs[2], show=False, color='C2')
            axs[2].legend([ref_target.name, target.name, original_target.name])
        else:
            axs[2].legend([ref_target.name, target.name])
        axs[2].set_title(f'{name} target')
        axs[2].set_ylim([-15, 15])


        fig.savefig(os.path.join(DIR_PATH, f'calibration_{name}.png'), bbox_inches='tight')

        target.plot_graph(show=False, file_path=os.path.join(DIR_PATH, f'target_{name}.png'), color='C0')
        target.write_to_csv(file_path=os.path.join(DIR_PATH, f'{name}.csv'))
        plt.close(fig)

    fig, axs = plt.subplots(1, 2)
    fig.set_size_inches(20, 8)
    onear_labels = []
    inear_labels = []
    for fr in stds:
        if 'onear' in fr.name:
            fr.plot_graph(fig=fig, ax=axs[0], color=f'C{len(onear_labels)}', show=False)
            onear_labels.append(fr.name)
        else:
            fr.plot_graph(fig=fig, ax=axs[1], color=f'C{len(inear_labels)}', show=False)
            inear_labels.append(fr.name)
    axs[0].legend(onear_labels)
    axs[1].legend(inear_labels)
    axs[0].set_title('On-ear')
    axs[1].set_title('In-ear')
    axs[0].set_ylim([0, 8])
    axs[1].set_ylim([0, 8])
    fig.savefig(os.path.join(DIR_PATH, 'STDs.png'))
    plt.close(fig)